首页 > 解决方案 > 数据争吵:在javascript中对两个不同数组的值求和并推送一个新对象

问题描述

我有以下格式的两个数组/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}]

计算/创建这个新数组的最佳方法是什么?

我试过这个:

  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. 有没有更好的方法来date解决 for 循环中的问题?与 for 循环不同的任何其他结构都可以。我想知道获取result数组检查的最佳方法是什么date

标签: javascriptarraysdata-wrangling

解决方案


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

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


推荐阅读