我找不到有关此特定问题的答案。
假设我有一系列字符串,或者在这种情况下是数字:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
我希望输出为:
var output = [[1,1,1], [2], [3,3,3,3,3], [4], [5, 5, 5]];
我希望使用lodash,但是大多数东西倾向于将重复的零件放在自己的数组中。也许某种.map
迭代器?
输出的顺序并不重要。它只需要将重复项切成我想保留的单独阵列。
您可以使用reduce
将数组元素分组到对象中。使用Object.values
将对象转换为数组。
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
var result = Object.values(x.reduce((c, v) => {
(c[v] = c[v] || []).push(v);
return c;
}, {}));
console.log(result);
较短版本:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
var result = Object.values(x.reduce((c, v) => ((c[v] = c[v] || []).push(v), c), {}));
console.log(result);
您可以用Array.Reduce以简洁的方式进行此操作:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5]
let result = x.reduce((r,c) => (r[c] = [...(r[c] || []), c],r), {})
console.log(Object.values(result))
Lodash完全相同的是:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5]
let result = _.values(_.groupBy(x))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
使用_.values
提取分组对象的值和_.groupBy
以获取实际分组
使用Array#prototype#reduce
分组:
const x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let helperObj = {};
const res = x.reduce((acc, curr) => {
// If key is not present then add it
if (!helperObj[curr]) {
helperObj[curr] = curr;
acc.push([curr]);
}
// Else find the index and push it
else {
let index = acc.findIndex(x => x[0] === curr);
if (index !== -1) {
acc[index].push(curr);
}
}
return acc;
}, []);
console.log(res);
由于您希望使用lodash,因此您可能对groupBy
感兴趣。它在对象上返回,但是_.values
将为您提供嵌套数组:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let groups = _.values(_.groupBy(x))
console.log(groups)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
这是一个势在必行的解决方案:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
x.sort();
var res = [];
for (const [i, n] of x.entries()) {
if (n !== x[i-1]) res.push([n]);
else res[res.length-1].push(n);
}
console.log(res);