将数组组分组为单独的子数组组

Grouping array group into separate sub array group

我有一个带有字符串的 JS 数组,例如:

let a = ["a", "a", "a", "b", "c", "c", "b", "b", "b", "d", "d", "e", "e", "e"]

我需要比较数组中的重复字符串,如果存在重复字符串,它将像这样分隔:

[ ["a", "a", "a"], ["b"], ["c", "c"], ["b", "b", "b"], ["d", "d"], ["e", "e", "e"] ]

我试图将它与 for 循环进行比较,但我不知道如何编写代码以便数组检查自己的字符串是否重复,而没有预先确定的字符串进行比较。

let a = ["a", "a", "a", "b", "c", "c", "b", "b", "b", "d", "d", "e", "e", "e"];

let b = [];

let len = a.length;

for (let i = 0; i < len; i++) {
  if (b.indexOf(a[i]) !== 1) {
    b.push(a[i]);
  }
}

console.log(b)

您可以使用 .reduce() 方法获得所需的输出,如下所示:

const data = ['a', 'a', 'a', 'b', 'c', 'c', 'b', 'b', 'b', 'd', 'd', 'e', 'e', 'e'];

const result = data.reduce(
  (r, c, i, a) => (
    c != a[i - 1] ? r.push([c]): r[r.length - 1].push(c), r
  ), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果你从数组中的第零个元素开始,你会得到 [["a"]] 然后如果你从第一个元素开始迭代,只检查它是否与前一个元素相同,你就可以确定是否推送到现有最后一个阵列,或开始一个新阵列。

因此使用 slice 获取除第零个元素之外的数组,并使用 forEach 累积新数组:

let a = ["a", "a", "a", "b", "c", "c", "b", "b", "b", "d", "d", "e", "e", "e"]

var result = [[a[0]]]
a.slice(1).forEach( (e,i) => {
  if(e == a[i]) {
    result[result.length-1].push(e);
  } else{
    result.push([e]);
  }
});
console.log(result)

如果您还想跟踪计数,那非常相似

let a = ["a", "a", "a", "b", "c", "c", "b", "b", "b", "d", "d", "e", "e", "e"]

var result = [{count:1, char:a[0]}]
a.slice(1).forEach( (e,i) => {
  if(e == a[i]) {
    result[result.length-1].count++;
  } else{
    result.push({count:1, char: e});
  }
});
console.log(result)