将数组组分组为单独的子数组组
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)
我有一个带有字符串的 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)