【问题标题】:Javascript - Put array items, including their duplicates, into a new arrayJavascript - 将数组项(包括它们的重复项)放入一个新数组中
【发布时间】:2019-05-24 16:08:33
【问题描述】:

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

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

【问题讨论】:

  • 所以你想将它们分组?
  • 一个字符串数组?这是您输入的整数数组。
  • 如果您仍然使用 lodash,grouper = _.flow([_.groupBy, _.values]) 将是您正在寻找的功能。

标签: javascript arrays lodash


【解决方案1】:

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

【讨论】:

  • 他们不是从平面数组开始,并试图得到一个非平面数组吗?
  • 天啊。哈哈哈。我需要更多的咖啡
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      由于您希望使用 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>

      【讨论】:

        【解决方案5】:

        这是一个命令式的解决方案:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-16
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 2017-06-19
          相关资源
          最近更新 更多