JavaScript-将数组项目(包括其重复项)放入新数组中



我找不到有关此特定问题的答案。

假设我有一系列字符串,或者在这种情况下是数字:

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);

最新更新