我希望以这种方式“添加/合并”(不知道如何调用它)某些对象:
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
}中返回)
答案 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
检查是因为我们不会NaN
将undefined
添加到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);