减少包含另一个数组的对象数组,减少相同对象的名称

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);