Javascript-将数组项(包括它们的重复项)放入新数组中

时间:2019-05-24 16:08:33

标签: javascript arrays lodash

我无法在S.O上找到针对这个特定问题的答案。

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

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迭代器?

输出的顺序并不重要。它只需要将重复项分块成我想保留的单独数组。

5 个答案:

答案 0 :(得分:5)

您可以使用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);

答案 1 :(得分:1)

您可以使用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获得实际的分组

答案 2 :(得分:0)

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

答案 3 :(得分:0)

由于您希望使用Lodash,因此您可能会对groupBy感兴趣。它返回对象,但是def reverse_vowels(word): all_vowels = ['a', 'e', 'i', 'o', 'u'] vowels = [] for char in word: if char.lower() in all_vowels: vowels.append(char.lower()) new_word = '' for char in word: if char.lower() in all_vowels: vowel = vowels.pop(-1) if char.isupper(): vowel = vowel.upper() new_word += vowel else: new_word += char return new_word 将为您提供嵌套数组:

_.values
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let groups = _.values(_.groupBy(x))
console.log(groups)

答案 4 :(得分:0)

这是当务之急:

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