我有一个对象数组。简化版本(只有几个属性):
let d = [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 },
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 },
]
想要按 team
分组,然后按 key
,使用纯 (ES6) JavaScript:
{
sales: {
employees: { team:"sales", key:"employees", value:24 },
floor: { team:"sales", key:"floor", value:2 }
},
finance: {
employees: { team:"finance", key:"employees", value:7 },
floor: { team:"finance", key:"floor", value:2 }
}
}
有点类似于other questions ,但不完全是。
到目前为止我所拥有的:使用 reduce 按 team
分组:
let groupBy = (data, field) => data.reduce((acc, obj) => Object.assign(acc, { [obj[field]]:( acc[obj[field]] || [] ).concat(obj) }), {})
let result = groupBy(d,'team')
这给出:
{
sales: [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 }
],
finance: [
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 }
]
}
不确定按团队内的key
级别分组的推荐方法是什么。
最佳答案
不是通过将每个对象连接到一个新数组来累积到一个数组,您可以累积到一个新的对象文字。您可以通过将累积的对象散布到一个新的对象字面量中来做到这一点。然后,您可以再次为当前对象团队传播累积对象的结果,或者如果不存在默认对象 (|| {}
)。最后,您可以在 obj.key
的嵌套对象文字上设置一个新键,并将其值设置为当前迭代对象本身。
const data = [
{ team:"sales", key:"employees", value:24 },
{ team:"sales", key:"floor", value:2 },
{ team:"finance", key:"employees", value:7 },
{ team:"finance", key:"floor", value:2 },
];
const groupBy = (array, field) => array.reduce((acc, obj) =>
({...acc, [obj[field]]: {...(acc[obj[field]] || {}), [obj.key]: obj}}), {});
console.log(groupBy(data,'team'));
关于JavaScript ES6 : array of objects to array grouped by key and indexed by property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60970646/