Javascript 对两个对象数组中的数据求和

Javascript 对两个对象数组中的数据求和,javascript,arrays,object,Javascript,Arrays,Object,我有两个对象数组,我想对具有相同键(在本例中为id)的对象求和,如果没有匹配键,则只需创建一个新的。。如果我没有解释清楚,我很抱歉,我对JavaScript/Array/Object还不熟悉 var dataOne = [ { id:"1", total: 10, win: 5 }, { id:"2", total: 5, win: 1 }, { id:"3", total: 5, win: 2 } ] 及 预期结果: var combinedData = [ { id:"1", total:

我有两个对象数组,我想对具有相同键(在本例中为id)的对象求和,如果没有匹配键,则只需创建一个新的。。如果我没有解释清楚,我很抱歉,我对JavaScript/Array/Object还不熟悉

var dataOne = [ { id:"1", total: 10, win: 5 }, { id:"2", total: 5, win: 1 }, { id:"3", total: 5, win: 2 } ]

预期结果:

var combinedData = [ { id:"1", total: 15, win: 7 }, { id:"2", total: 7, win: 4 }, { id:"3", total: 5, win: 2 }, { id:"5", total: 5, win: 4 } ]
我已尝试使用来自的解决方案 但是,显然,数据的类型有所不同

所以,我试着用这个方法

但显然,这种方法对于对象数组不起作用。 我明白了


因此。

我建议使用
数组。在这里减少
。在reduce函数体中,如果
id
不在结果累加器中,则添加它,然后增加对象中每个属性的所有值

var-dataOne=[{id:“1”,总计:10,赢:5},{id:“2”,总计:5,赢:1},{id:“3”,总计:5,赢:2}]
var dataTwo=[{id:“1”,总计:5,赢:2},{id:“2”,总计:2,赢:3},{id:“5”,总计:5,赢:4}]
var sumObjectsByKey=(…objs)=>
Object.values(objs.reduce)((a,e)=>{
a[e.id]=a[e.id]|{id:e.id};
用于(e中的常数k){
如果(k!=“id”){
a[e.id][k]=a[e.id][k]?a[e.id][k]+e[k]:e[k];
}
}
返回a;
}, {}))
;

log(sumObjectsByKey(…dataOne,…dataTwo))
通过扩展到
Array.concat()
组合两个数组。将当前项目与地图中已存在的项目组合时,将项目减少到地图中。通过展开
Map.values()
迭代器将其转换回数组:

//求和到对象值的实用函数(不带id)
常量sumItem=({id,…a},b)=>({
身份证件
…对象。键(a)
.reduce((r,k)=>({…r[k]:a[k]+b[k]}),{})
});
const sumObjectsByKey=(…arrs)=>[。。。
[].concat(…arrs)//组合阵列
.reduce((m,o)=>//将组合数组重新生成映射
m、 set(o.id,//如果将项目添加到映射
m、 has(o.id)?sumItem(m.get(o.id),o):{…o}//如果映射中存在该项,请将当前项与映射中的项相加。如果不存在,请将当前项的克隆添加到映射中
)
,新映射)。值()]
const dataOne=[{id:“1”,总计:10,赢:5},{id:“2”,总计:5,赢:1},{id:“3”,总计:5,赢:2}]
constdatatwo=[{id:“1”,总计:5,赢:2},{id:“2”,总计:2,赢:3},{id:“5”,总计:5,赢:4}]
const result=sumObjectsByKey(数据一、数据二)

console.log(result)
谢谢你的回答,但我发现ID不见了。。但后来我也找到了一种再次显示ID的方法,在!==之后添加if(k==“ID”){a[e.ID][k]=a[e.ID][k]?a[e.ID][k]:e[k];}id if end--edit,刚刚发现我不能在评论中使用html标记,如果我只想添加一列,合并另一列呢?
var combinedData = [ { id:"1", total: 15, win: 7 }, { id:"2", total: 7, win: 4 }, { id:"3", total: 5, win: 2 }, { id:"5", total: 5, win: 4 } ]
 function sumObjectsByKey(...objs) {
      for (var prop in n) {
        if (acc.hasOwnProperty(prop)) acc[prop] += n[prop];
        else acc[prop] = n[prop];
      }
      return acc;
    }
var combinedData = sumObjectsByKey(dataOne, dataTwo);
{0: "0[object Object][object Object]", 1: "0[object Object][object Object]", 2: "0[object Object][object Object]"}