将数组分组为不同的子数组组。

3

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

2个回答

3

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


1
您可以使用.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; }


1
如果您将字符存储在对象中而不仅仅是一个数字,那么.map().fill()是不必要的。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接