我有如下对象:
const attributes = [
{
id: "a",
values: [
{
value: [
{
_id: "aa",
value: "1500"
},
{
_id: "ab",
value: "580"
}
]
},
{
value: [
{
_id: "aa",
value: "400"
}
]
}
]
},
{
id: "a",
values: [
{
value: [
{
_id: "aa",
value: "420"
},
{
_id: "ab",
value: "300"
}
]
},
{
value: [
{
_id: "aa",
value: "480"
},
{
_id: "ab",
value: "1000"
}
]
},
{
value: [
{
_id: "aa",
value: "880"
},
{
_id: "ab",
value: "740"
}
]
}
]
},
{
id: "b",
values: [
{
value: [
{
_id: "ba",
value: "1500"
},
{
_id: "bb",
value: "580"
}
]
},
{
value: [
{
_id: "ba",
value: "400"
}
]
}
]
},
];
我希望能够根据属性
id
和值 _id
来对数据进行分组,以便返回以下对象:[
{
id: "a",
values: [
{
value: [
{
_id: "aa",
values: ["1900", "1780"]
},
{
_id: "ab",
values: ["580", "2040"]
}
]
}
]
},
{
id: "b",
values: [
{
value: [
{
_id: "ba",
values: ["1900"]
},
{
_id: "bb",
values: "[580"]
}
]
},
]
},
];
如果结果不合理,我可以做更多的解释。无论如何,我尝试通过以下方式来尝试结果,但它并没有像预期的那样工作,我相信有更简洁的方法来实现。
let newAttributes = [];
attributes.forEach(attribute => {
let currentAttribute = { id: attribute.id, values: attribute.values[0] };
attribute.values.shift();
attribute.values.forEach(attributeValues => {
attributeValues.value.forEach(vl => {
var values = currentAttribute.values.value.find(vl2 => vl2._id === vl._id);
if (values && attribute.id === currentAttribute.id) {
if (!values.values) {
values.values = [];
}
values.values.push(vl.value);
}
});
});
newAttributes.push(attributes);
});
newAttributes.forEach(attribute => {
attribute.values.value.forEach(vl => {
if (vl.values) {
vl.values.push(vl.value);
} else {
vl.values = [vl.value]
}
delete vl.value;
});
attribute.values.value.forEach(vl => {
vl.values = vl.values.reduce((a, b) => {
return Number(a) + Number(b);
}, 0);
vl.values = [vl.values.toString()]
});
});
console.log(newAttributes);
编辑:
解释:我们以属性id ='a'
和值_id='aa'
为例:
对于第一个带有id ='a'
的属性,我们有两个值具有_id='aa'
,其中一个为1500,另一个为400,将这两个值相加得到1900,然后我们还有另一个带有id ='a'
的属性,其具有3个值,其中_id='aa'
,分别为420、480和880,这些值的总和为1780,我们将该总和推入第一个带有id ='a'
的属性中_id='aa'
的值中。