我有一个Javascript对象数组。每个对象都包含一个data
在此感兴趣的数组。我想减少所有具有相同名称的对象的数组(不同的ID无关紧要,因为稍后我想在图中绘制数据)。
norm.series = [
{ id: "qah01", name: "Bingo", data: [ ["date1", 1.5] ] },
{ id: "qah02", name: "Combo", data: [ ["date2", 2.5] ] },
{id: "qah03", name: "Bingo", data: [ ["date1", 0.5], ["date3", 1.2], ["date4", 2.0] ] },
{ id: "qah04", name: "Sango", data: [ ["date7", 3.2], ["date8", 2.8] ] }
]
What I yould like is the following:
norm.series [
{ id: "qah01", name: "Bingo", data: [ [date1, 2.0], [date3, 1.2], [date4, 2.0] ] },
{ id: "qah02", name: "Combo", data: [ [date2, 2.5] ] },
{ id: "qah04", name: "Sango", data: [ [date7, 3.2], [date8, 2.8] ] }
]
到目前为止,这是我所做的:
const result = norm.series.reduce((acc, d) => {
const found = acc.find((a, index) => a.data[index][0] === d.data[index][0]);
const dataNew = a.data[index][1] + d.data[index][1];
if (!found) {
acc.push({id: d.id, name:d.name, data: d.data})
}
else {
found.data.push(dataNew);
}
return acc;
}, []);
您可以使用Array.reduce
方法获得结果。在内部Array.reduce
,您可以使用查找匹配的值Array.findIndex
并为其创建处理程序。
const input = [
{ id: "qah01", name: "Bingo", data: [ [ 'date1', 1.5 ] ] },
{ id: "qah02", name: "Combo", data: [ [ 'date2', 2.5 ] ] },
{ id: "qah03", name: "Bingo", data: [ [ 'date1', 0.5 ], [ 'date3', 1.2 ], [ 'date4', 2.0 ] ] },
{ id: "qah04", name: "Sango", data: [ [ 'date7', 3.2 ], [ 'date8', 2.8 ] ] }
];
const output = input.reduce((acc, cur) => {
const matchedIndex = acc.findIndex(({ name }) => name === cur.name);
if (matchedIndex >= 0) {
acc[matchedIndex].data = acc[matchedIndex].data.concat(cur.data).reduce((tor, curV) => {
const matchedDataInd = tor.findIndex(([dateName, dateValue]) => dateName === curV[0]);
if (matchedDataInd >= 0) {
tor[matchedDataInd][1] += curV[1];
return tor;
} else {
return [ ...tor, curV ];
}
}, []);
return acc;
} else {
return [ ...acc, cur ];
}
}, []);
console.log(output);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句