Javascript中对象列表的分组
我从函数[{…},{…},{…},{…}]输出了类似这样的内容,它看起来像提供的代码片段 我想按系统标签和上面所需的输出对这个进行分组。GroupBy只还给我一个对象Javascript中对象列表的分组,javascript,arrays,sorting,grouping,Javascript,Arrays,Sorting,Grouping,我从函数[{…},{…},{…},{…}]输出了类似这样的内容,它看起来像提供的代码片段 我想按系统标签和上面所需的输出对这个进行分组。GroupBy只还给我一个对象 [ { id: 100, system: {id: 101, label: "BLUE", createdAt: "2019-07-30"}, details: [{...},{...}], info: "Test1" }, {
[
{
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”},我能把它添加到我的结束形式吗?要得到这样的结果(可能有多个值)。。。“颜色”:“蓝色”、“形状”:[“圆形”、“方形”、“方形”…]“打字”:[…..谢谢!这对我很有用。你知道有没有办法计算现在有多少项目被分组在一起,并在“颜色”和“形状”级别保存?你知道办法吗?在推到对象值时,你只需要更新长度值