减少包含另一个数组的对象数组,减少相同对象的名称
Reduce Array of Objects containing another array, reduce by same object's name
我有一个 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);
我有一个 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);