JavaScript / Coffeescript求和对象

时间:2018-01-24 15:51:22

标签: javascript coffeescript underscore.js

我希望以这种方式“添加/合并”(不知道如何调用它)某些对象:

obj1 = { 
  a: 1,
  b: 1,
  c: 1
}

obj2 = { 
  a: 1,
  b: 1
}

obj1 + obj2 => { a: 2, b: 2, c: 1 }

有没有办法实现这个目标?尝试过,Object.assign(obj1, obj2)但它不会添加我需要完成的属性(它会在{ a: 1, b: 1, c: 1}中返回)

3 个答案:

答案 0 :(得分:3)

没有内置的方法可以执行此操作,但您可以枚举一个对象的属性并将其值添加到另一个对象。



const a = { a: 1, b: 1, c: 1 };
const b = { a: 1, b: 1 };
for(const prop in b) {
  a[prop] = (prop in a ? a[prop] : 0) + b[prop];
}
console.log(a);




prop in a检查是因为我们不会NaNundefined添加到b中的值。

您可以使用reduce来组合n个对象,如下所示:



const a = { a: 1, b: 1, c: 1 };
const b = { a: 1, b: 1 };
const c = { a: 1, c: 1 };
const result = [a, b, c].reduce((p, c) => {
  for(const prop in c) {
    p[prop] = (prop in p ? p[prop] : 0) + c[prop];
  }
  return p;
}, {});
console.log(result);




你没有提到你想如何处理原型链中的属性。您应该知道for...in将枚举原型链中的属性,prop in x也将检查原型链。如果您只想枚举对象自己的属性,那么您可以使用Object.entries()获取自己的属性,或在hasOwnProperty(...)内进行for...in检查,代替prop in x校验。如果你没有对你的模型进行任何原型继承,那么你可能不在乎。

答案 1 :(得分:1)

快速回答:



let sum = {};
let keys = new Set(Object.keys(obj1))
Object.keys(obj2).map(x => keys = keys.add(x))

keys.forEach(x => {
	let op1 = obj1[x] || 0;
	let op2 = obj2[x] || 0;
	sum[x] = op1 + op2;
})




答案 2 :(得分:0)

创建一个空对象:

var obj3 = {};

使用spread operator从两个对象中获取所有键,然后将它们添加到新对象中,如下所示:

for(var i in {...obj1, ...obj2}) {
  obj3[i] = (obj1[i] || 0) + (obj2[i] || 0);
}

var obj1 = { 
  a: 1,
  b: 1,
  c: 1
}

var obj2 = { 
  a: 1,
  b: 2,
  d: 3
}

var obj3 = {};

for(var i in {...obj1, ...obj2}) {
  obj3[i] = (obj1[i] || 0) + (obj2[i] || 0);
}

console.log(obj3);