首页 > 解决方案 > 将数组组分组为单独的子数组组

问题描述

我有一个带有字符串的 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)

标签: javascriptarrayssortinggrouping

解决方案


如果你从你得到的数组中的第零个元素开始[["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)


推荐阅读