Javascript中对象列表的分组

Javascript中对象列表的分组,javascript,arrays,sorting,grouping,Javascript,Arrays,Sorting,Grouping,我从函数[{…},{…},{…},{…}]输出了类似这样的内容,它看起来像提供的代码片段 我想按系统标签和上面所需的输出对这个进行分组。GroupBy只还给我一个对象 [ { id: 100, system: {id: 101, label: "BLUE", createdAt: "2019-07-30"}, details: [{...},{...}], info: "Test1" }, {

我从函数[{…},{…},{…},{…}]输出了类似这样的内容,它看起来像提供的代码片段

我想按系统标签和上面所需的输出对这个进行分组。GroupBy只还给我一个对象

  [
     {
       id: 100,
       system: {id: 101, label: "BLUE", createdAt: "2019-07-30"},
       details: [{...},{...}],
       info: "Test1"
     },
     {
       id: 400,
       system: {id: 404, label: "RED", createdAt: "2019-10-30"},
       details: [{...},{...}],
       info: "Test2"
     },
     {
       id: 800,
       system: {id: 404, label: "RED", createdAt: "2019-10-30"},
       details: [{...},{...}],
       info: "Test3"
     }
   ]
我想要这样的东西,按系统标签分组:

const after= [
  {
    color: 'BLUE',
    types: [{
             id: 100,
             system: {id: 101, label: "BLAU", createdAt: "2019-07-30"},
             details: [{...},{...}],
             info: "Test1"
           }]
  },
  {
    color: 'RED',
    types: [{
             id: 400,
             system: {id: 404, label: "RED", createdAt: "2019-10-30"},
             details: [{...},{...}],
             info: "Test2"
           },
           {
             id: 800,
             system: {id: 404, label: "RED", createdAt: "2019-10-30"},
             details: [{...},{...}],
             info: "Test2"
           }]
  }
];

一个选项是使用
reduce
汇总数组,并使用
Map
作为累加器

let arr=[{“id”:100,“system”:{“id”:101,“label”:“BLUE”,“createdAt”:“2019-07-30”},“details”:[],“info”:“Test1”},{“id”:400,“system”:{“id”:404,“label”:“RED”,“createdAt”:“2019-10-30”},“details”:[],“info”:“Test2”},{“id”:800,“system”:“id”:404,“label”:“RED”,“createdAt”:“2019-10-30”;“details”:“details”[],“info”:“Test3”};
让结果=[…arr.reduce((c,v)=>{
设k=v.system.label;
如果(!c.has(k))c.set(k,{color:k,type:[]});
c、 get(k)、type.push(v);
返回c;
},新映射)。值();

控制台日志(结果)
您可以使用
Array.prototype.reduce
按系统标签分组,然后获得如下对象值

const数据=[
{
id:100,
系统:{id:101,标签:“蓝色”,创建日期:“2019-07-30”},
形状:{id:404,标签:“圆形”,创建日期:“2019-10-30”},
详情:[{},{}],
信息:“Test1”
},
{
id:400,
形状:{id:405,标签:“方形”,创建日期:“2019-10-30”},
系统:{id:404,标签:“红色”,创建日期:“2019-10-30”},
详情:[{},{}],
信息:“测试2”
},
{
id:800,
形状:{id:406,标签:“圆形”,创建日期:“2019-10-30”},
系统:{id:404,标签:“红色”,创建日期:“2019-10-30”},
详情:[{},{}],
信息:“Test3”
}
]
const res=数据减少((附件,项目)=>{
if(附件[项目系统标签]){
acc[项目.系统.标签].typen.push(项目);
acc[item.system.label].shape.push(item.shape.label);
}否则{
acc[项目系统标签]={
颜色:item.system.label,
形状:[item.shape.label],
类型:[项目]
}
}
返回acc;
}, {})

console.log(Object.values(res))感谢您的快速响应!很乐意帮助:)当我的对象中有类似于系统的东西时,让我们称它为:shape:{id:404,标签:“round”,createdAt:“2019-10-30”},我能把它添加到我的结束形式吗?要得到这样的结果(可能有多个值)。。。“颜色”:“蓝色”、“形状”:[“圆形”、“方形”、“方形”…]“打字”:[…..谢谢!这对我很有用。你知道有没有办法计算现在有多少项目被分组在一起,并在“颜色”和“形状”级别保存?你知道办法吗?在推到对象值时,你只需要更新长度值