【问题标题】:How can I sum properties from two objects?如何对两个对象的属性求和?
【发布时间】:2023-04-05 02:35:01
【问题描述】:

我有多个 JavaScript 对象:

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

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

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

结果:

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

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

【问题讨论】:

  • 只有两个对象?
  • 没有多个对不起我正确
  • @LionelB 如果有多个,则必须将其存储为数组。
  • 你的对象在哪里?在数组中,还是仅仅停留在变量中?
  • 你提前知道属性吗?

标签: javascript sum


【解决方案1】:

你可以使用 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));

【讨论】:

    【解决方案2】:

    再深入一点,只要对象是等价的就行!

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

    【讨论】:

    • 让我免于自己写这篇文章。非常有帮助 - 谢谢!
    【解决方案3】:

    试试这个。

    let t1 = 
    { 
      a:12,
      b:8,
      c:17
    };
    
    let t2 = 
    { 
      a:2,
      b:4,
      c:1
    };
    
    function sum(ob1, ob2) {
      let sum = {};
    
      Object.keys(ob1).forEach(key => {
        if (ob2.hasOwnProperty(key)) {
          sum[key] = ob1[key] + ob2[key]
        }  
      })
      return sum;
    }
    
    sum(t1, t2);
    

    https://jsfiddle.net/fbnt2vhe/

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2017-08-04
        • 2022-09-23
        相关资源
        最近更新 更多