【问题标题】:sum values of two different objects两个不同对象的总和
【发布时间】:2017-02-13 11:37:14
【问题描述】:

我有两个不同的对象

var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 };

我想将它们的值相加,如下面的示例所示

{ a: 13, b: 20, c: 36, d: 3 }

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @VilasKumkar 我试过 for..in 循环,结合 Object.keys().... 但只有结果我得到的是所有的总和,我的意思是我得到了 72

标签: javascript javascript-objects


【解决方案1】:

使用Array#reduce方法

var objA = {
  a: 10,
  b: 20,
  c: 30
};
var objB = {
  a: 3,
  c: 6,
  d: 3
};

console.log(
  // concatenate keys array
  Object.keys(objA).concat(Object.keys(objB))
  // or use Object.keys(Object.assign({},objA,objB))

  // iterate to generate the object
  .reduce(function(obj, k) {
    // define object property, treat as 0 if not defined
    obj[k] = (objA[k] || 0) + (objB[k] || 0);
    // return object difference
    return obj;
    // set initial value as an empty object
  }, {})
)

或者更好的方法,将初始值定义为第二个对象的副本。

var objA = {
  a: 10,
  b: 20,
  c: 30
};
var objB = {
  a: 3,
  c: 6,
  d: 3
};

console.log(
  // get property names array of objB ----Edit objA -----
  Object.keys(objA)
  // iterate over array
  .reduce(function(obj, k) {
    // add value to existing property or update
    obj[k] = (obj[k] || 0) + objA[k];
    // return object reference
    return obj;
    // define initial value as an object which holds 
    // all the property and value in objB
  }, Object.assign({}, objB))
)

【讨论】:

  • 是的,这就是我需要的。不错的解决方案...干杯
【解决方案2】:

使用lodash

function customizer(objValue, srcValue) {
    if(objValue && srcValue)
    return objValue+srcValue;
}

var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 };

console.log(_.mergeWith(objA, objB, customizer));

Demo

【讨论】:

    【解决方案3】:

    var objA = { a: 10, b: 20, c: 30 }; var objB = { a: 3, c: 6, d: 3 };
    var objC = {}
    for (key in objA) {
    	if (objB.hasOwnProperty(key)) {
    		objC[key] = objA[key] + objB[key]
      } else {
      	objC[key] = objA[key]
      }
    }
    for (key in objB) {
    	if (!objC.hasOwnProperty(key)) {
        if (objA.hasOwnProperty(key)) {
          objC[key] = objA[key] + objB[key]
        } else {
          objC[key] = objB[key]
        }
      }
    }
    console.log(objC)

    【讨论】:

      【解决方案4】:

      我非常喜欢第二个 Pranav C Balan 解决方案。但是我浪费了一点时间,所以也发布我的解决方案:)。

      var objA = { a: 10, b: 20, c: 30 };
      var objB = { a: 3, c: 6, d: 3 };
      
      
      let params = Array.from(new Set(Object.keys(objA).concat(Object.keys(objB))));
      let sum = params.map(param => (objA[param] || 0) + (objB[param] || 0));
      
      console.log(params, sum);
      

      【讨论】:

        【解决方案5】:

        使用Object.assign()Array.prototype.reduce() 函数对解决方案进行排序:

        var objA = { a: 10, b: 20, c: 30 },
            objB = { a: 3, c: 6, d: 3},
            merged = Object.assign({}, objA, objB);
        
        var result = Object.keys(merged).reduce(function (r, k) {
            r[k] = (merged[k] && objA[k] && objB[k])? merged[k] + objA[k] : merged[k];
            return r;
        }, {});
        
        console.log(result);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          • 1970-01-01
          相关资源
          最近更新 更多