[英]Group array of objects based on the object's key/value-pair which is in an array
I've been really going at this problem, where I have to group an array of object based on the object's subproperty key/value-pairs. 我一直在研究这个问题,我必须根据对象的子属性键/值对对对象数组进行分组。 If managed to get it working if it's on the first level with distinct key/values (in this case "name"), but not when it's based on array values in the containing object.
如果设法使它在具有不同键/值的第一个级别(在本例中为“名称”)运行,而在基于包含对象中的数组值的情况下则无法运行。 Appreciate any help!
感谢任何帮助!
I want to go from: 我想从:
let array = [
{name: 'Name1', classes: [
{className: 'class1'}, {className: 'class2'}
]},
{name: 'Name2', classes: [
{className: 'class1'}
]},
{name: 'Name3', classes: [
{className: 'class2'}
]}
];
into something like: 变成类似:
let resultArray = [
{
class1: [
{ name: 'Name1', classes: [{ className: 'class1' }, { className: 'class2' }] },
{ name: 'Name2', classes: [{ className: 'class1' }] }
]
},
{
class2: [
{ name: 'Name1', classes: [{ className: 'class1' }, { className: 'class2' }] },
{ name: 'Name3', classes: [{ className: 'class2' }] }
]
}
];
Edit: sorry, didn't add the Minimal, Complete, and Verifiable example. 编辑:对不起,没有添加最小,完整和可验证的示例。 What I had before was:
我以前的经历是:
const groupByKey = (arr) =>
arr.reduce((r, v, i, a, k = v.name) => {
const rTemp = r;
rTemp[k] = rTemp[k] ? rTemp[k] : [];
rTemp[k].push(v);
return rTemp;
}, {});
which presented it grouped on name (which is not what I wanted obviously, but works on "first level") 将其按名称分组显示(这显然不是我想要的,但可以在“第一级”上使用)
You can use reduce
您可以使用
reduce
array.reduce((acc, curr) => {
curr.classes.forEach(cls => {
if(acc[cls.className]) {
acc[cls.className].push(curr);
} else {
acc[cls.className] = [curr];
}
})
return acc;
}, []);
Easier Implementation 实施更容易
let array = [ { name: 'Name1', classes: [ { className: 'class1' }, { className: 'class2' } ] }, { name: 'Name2', classes: [ { className: 'class1' } ] }, { name: 'Name3', classes: [ { className: 'class2' } ] } ]; let resultArray = [] array.forEach(function (element) { element.classes.forEach(function (innerelement) { if (!resultArray[innerelement.className]) resultArray[innerelement.className] = [] resultArray[innerelement.className].push(element); }) }) console.log(resultArray)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.