Javascript - 具有相同属性的两个对象的总和

时间:2017-02-27 14:20:46

标签: javascript sum

我有多个javascript对象

{ a:12,
  b:8,
  c:17
}

并且

{ a:2,
  b:4,
  c:1
}

我需要用键

来总结这两个对象

结果:

 { a:14,
  b:12,
  c:18
 }

你有任何javascript解决方案吗? 我使用Object.keys.map但它太长了,因为我在对象中有100个元素

谢谢你的帮助

4 个答案:

答案 0 :(得分:14)

你可以使用reduce,下面的函数可以获取你想要的任意数量的对象,并按键求和:



var obj1 = {
  a: 12,
  b: 8,
  c: 17
};

var obj2 = {
  a: 12,
  b: 8,
  c: 17
};

var obj3 = {
  a: 12,
  b: 8,
  c: 17
};


function sumObjectsByKey(...objs) {
  return objs.reduce((a, b) => {
    for (let k in b) {
      if (b.hasOwnProperty(k))
        a[k] = (a[k] || 0) + b[k];
    }
    return a;
  }, {});
}

console.log(sumObjectsByKey(obj1, obj2, obj3));




答案 1 :(得分:5)

稍微深一点,只要对象相同就可以了!

const arr = [{
    a: 12,
    b: { a: 12, c: { a: 12 } },
    c: 17
  },
  {
    a: 12,
    b: { a: 12, c: { a: 12 } },
    c: 17
  },
  {
    a: 12,
    b: { a: 12, c: { a: 12 } },
    c: 17
  }
];

const deepMergeSum = (obj1, obj2) => {
  return Object.keys(obj1).reduce((acc, key) => {
    if (typeof obj2[key] === 'object') {
      acc[key] = deepMergeSum(obj1[key], obj2[key]);
    } else if (obj2.hasOwnProperty(key) && !isNaN(parseFloat(obj2[key]))) {
      acc[key] = obj1[key] + obj2[key]
    }
    return acc;
  }, {});
};

const result = arr.reduce((acc, obj) => acc = deepMergeSum(acc, obj));
console.log('result: ', result);

答案 2 :(得分:0)

试试这个。

<script type="text/javascript">
   function onEdit(e) {
      var event = e.event;   
      if (event.isNew() && (event.recurrenceId == null)) {
         // default start/end times to empty
         event.set("start", "");
         event.set("end", "");
      }
   }
</script>

https://jsfiddle.net/fbnt2vhe/

答案 3 :(得分:0)

如果对象具有所有公共密钥,则可以提前从一个对象获取密钥并迭代以创建新的结果对象,然后迭代单个对象中的密钥。

&#13;
&#13;
var o1 = { a: 12, b: 8, c: 17 },
    o2 = { a: 2, b: 4, c: 1 },
    keys = Object.keys(o1),
    result = [o1, o2].reduce(function (r, o) {
        keys.forEach(function (k) {
            r[k] += o[k];
        });
        return r;
    }, keys.reduce(function (r, k) {
        r[k] = 0;
        return r;
    }, Object.create(null)));
    
console.log(result);
&#13;
&#13;
&#13;