数据整理:将 javascript 中两个不同数组的值相加并推送一个新对象

Data wrangling: Sum values from two different arrays in javascript and push a new object

我有两个 arrays/json 文件,格式如下:

  const data2 = [{date: "2018-04-23", a: 2, b: 2},
   {date: "2020-04-24", a: 1, b: 2},
   {date: "2020-04-25", a: 1, b: 2}]
  
  const data3 = [{date: "2018-04-23", a: 5, b: 2},
   {date: "2020-04-24", a: 4, b: 2},
   {date: "2020-04-25", a: 1, b: 2}]

我想得到以下结果:

  const result = [{date: "2018-04-23", sum: 7},
   {date: "2020-04-24", sum: 5},
   {date: "2020-04-25", sum: 2}]

calculate/create 这个新数组的最佳方法是什么?

我试过这个:

  let result = [];

  for( var i=1; i < data3.length; i++) {
    result.push({ date: data3[i].date,
                  sum: data2[i].a + data3[i].a})   
  }

问题是我需要确保 data2data3 数组都按 date 排序。有没有更好的方法来考虑 for 循环中的 date ?与 for 循环不同的任何其他结构都可以。我想知道通过 date.

获取 result 数组检查的最佳方法是什么
const result = data2.map(item => {
    const fItem = data3.find(e=>e.date === item.date)
    if(fItem){
        return {date: item.date, sum: item.a + fItem.a}
    }
    return {date: item.date, sum: item.a}
})

希望这段代码对你有用

我有另一个解决方案是将 data3 转换为一个对象,键是日期,值是一个属性。例如:

const object = data3.reduce((init, item)=> ({...init, [item.date]: item.a}), {})

之后使用同上

    const fItem = data3.find(e=>e.date === item.date)

改为

    const fItem = obj[item.date]

您可以创建地图,然后对值求和

const data2 = [{
    date: "2018-04-23",
    a: 2,
    b: 2
  },
  {
    date: "2020-04-24",
    a: 1,
    b: 2
  },
  {
    date: "2020-04-25",
    a: 1,
    b: 2
  }
]

const data3 = [{
    date: "2018-04-23",
    a: 5,
    b: 2
  },
  {
    date: "2020-04-24",
    a: 4,
    b: 2
  },
  {
    date: "2020-04-25",
    a: 1,
    b: 2
  }
]

const map2 = data2.reduce((acc, cur) => {
  acc[cur.date] = cur.a;
  return acc;
}, {});
const map3 = data3.reduce((acc, cur) => {
  acc[cur.date] = (acc[cur.date] || 0) + cur.a;
  return acc;
}, map2);
const result = Object.keys(map3).map(k => {
  return {
    date: k,
    sum: map3[k]
  };
});


console.log(result);