【发布时间】:2020-05-16 04:36:32
【问题描述】:
我有以下对象:
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 = 'aa' 的第一个属性的值id = 'a'
【问题讨论】:
-
预期输出不干净
-
@brk 请看我的编辑,我添加了解释。
标签: javascript arrays json object