【问题标题】:JavaScript/Coffeescript sum objectsJavaScript/Coffeescript 总和对象
【发布时间】:2018-01-25 05:30:55
【问题描述】:

我很想以这种方式“添加/合并”(不知道如何调用)一些对象:

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} 中返回)

【问题讨论】:

  • 没有像Object.assign 这样的内置功能,但实现起来很简单。自从知道Object.assign 不能满足您的要求后,您还尝试了哪些其他

标签: javascript coffeescript underscore.js


【解决方案1】:

没有内置的方法可以做到这一点,但您可以枚举一个对象的属性并将它们的值添加到另一个对象。

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 检查是通过将undefined 添加到b 中的值,我们不会以NaN 结束。

您可以使用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() 来获取其自己的属性或在for...in 中进行hasOwnProperty(...) 检查并代替prop in x 检查。如果您不对模型进行任何原型继承,那么您可能不在乎。

【讨论】:

    【解决方案2】:

    快速回答:

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

    【讨论】:

      【解决方案3】:

      创建一个空对象:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-01
        • 1970-01-01
        • 2014-08-08
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 2021-03-11
        相关资源
        最近更新 更多