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

Lio*_*l B 6 javascript sum

我有多个javascript对象

{ a:12,
  b:8,
  c:17
}
Run Code Online (Sandbox Code Playgroud)

{ a:2,
  b:4,
  c:1
}
Run Code Online (Sandbox Code Playgroud)

我需要通过键对这两个对象求和

结果:

 { a:14,
  b:12,
  c:18
 }
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助

chr*_*con 17

你可以使用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));
Run Code Online (Sandbox Code Playgroud)


小智 8

更深一点,只要对象相同,你想要的就是它!

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);
Run Code Online (Sandbox Code Playgroud)