【问题标题】:Adding up the values of an array of objects javascript添加对象数组javascript的值
【发布时间】:2020-09-14 00:53:05
【问题描述】:

我有一个这样的对象数组:const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]

我想要一个像 results = [{a:4 , b:5}] 这样的数组,它是根据键来自对象数组的所有值的总和。

我尝试过这样的事情,但有时它会跳过数组中的第一个对象:

       array.reduce((acc, n) => {
          for (var prop in n) {
            if (acc.hasOwnProperty(prop)) acc[prop] += n[prop];
            else acc[prop] = 0;
          }
          return acc;
        }, {})

【问题讨论】:

    标签: javascript arrays reactjs performance ecmascript-6


    【解决方案1】:

    你需要在分配之前初始化acc,所以下面的小修改就可以了

     const array=[{a:1, b:1} , {a:2, b:3} ,{a:1, b:1}]
     const res = array.reduce((acc, n) => {
              for (var prop in n) {
              acc[prop] = acc[prop] || 0; // Need to initialize before assigning
                if (n.hasOwnProperty(prop)) {
                     acc[prop] += n[prop];
                   } 
              }
              return acc;
            }, {})
    console.log(res);

    【讨论】:

      【解决方案2】:

      这会起作用

      const res = [{a:1, b:1, c: 1} , {a:2, b:3, c:3} ,{a:1, b:1, c: 3}].reduce((a,v,i) => {
          for(let key in v) {
            a[key] = a[key] ? a[key] + v[key] : v[key];
          }
          return a
      },{})
      
      console.log(res)

      【讨论】:

      • 静态指定对象属性似乎不是最好的解决方案,因为我相信他的示例对象(obj.a、obj.b 等)可能是他正在处理的内容的简化版本生产。
      • 是的,同意...感谢您的宝贵意见..我已经更新了答案
      【解决方案3】:

      您可以使用此代码,而不必手动指定对象属性,如果它不存在,它将创建一个新属性,如果存在则添加到现有属性。

      var myarr = [{a: 2, b: 3}, {a:3, b:2}];
      var newobj = {};
      
      for (var i=0; i <= myarr.length; i += 1)   
        for (var p in myarr[i]) newobj[p] = (p in newobj) ? 
          newobj[p] + myarr[i][p] : myarr[i][p]
          
      console.log(newobj);

      【讨论】:

        【解决方案4】:

        使用forEachObject.entries 会简化。

        const array = [
          { a: 1, b: 1 },
          { a: 2, b: 3 },
          { a: 1, b: 1 },
        ];
        
        const acc = (arr) => {
          const res = {};
          arr.forEach((obj) =>
            Object.entries(obj).forEach(
              ([key, value]) => (res[key] = key in res ? res[key] + value : value)
            )
          );
          return [res];
        };
        
        console.log(acc(array));

        【讨论】:

          猜你喜欢
          • 2019-06-13
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          相关资源
          最近更新 更多