首页 > 解决方案 > 在 JavaScript 中按键值将集合分组为集合集合

问题描述

我有一系列如下项目:

[
    { Number: 1, Description: "Example description 1"},
    { Number: 1, Description: "Example description 2"},
    { Number: 2, Description: "Example description 3"},
    { Number: 2, Description: "Example description 4"}
]

我想按Number属性对其进行分组以获得下一个结果:

[
    [
        { Number: 1, Description: "Example description 1"},
        { Number: 1, Description: "Example description 2"}
    ]
    [
        { Number: 2, Description: "Example description 3"},
        { Number: 2, Description: "Example description 4"}
    ]
]

下一个功能几乎对我有用:

var groupBy = function(xs, key) {

      return xs.reduce(function(rv, x) {
            (rv[x[key]] = rv[x[key]] || []).push(x);
            return rv;
      }, {});
}

但它返回带有属性的对象,其中每个属性都是一个数组。这使我无法在其上使用map功能。

我怎样才能克服这个问题以获得能够使用的数组数组map

标签: javascriptarraysecmascript-6collectionsgroup-by

解决方案


您可以从对象中获取值。

const
    groupBy = function(xs, key) {
        return Object.values(xs.reduce(function(rv, x) {
            (rv[x[key]] = rv[x[key]] || []).push(x);
            return rv;
        }, {}));
    },
    data = [{ Number: 1, Description: "Example description 1" }, { Number: 1, Description: "Example description 2" }, { Number: 2, Description: "Example description 3" }, { Number: 2, Description: "Example description 4" }];
    
console.log(groupBy(data, 'Number'));
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读