【问题标题】:Javascript Sum array of object valuesJavascript Sum 对象值数组
【发布时间】:2015-08-20 23:27:40
【问题描述】:

我认为这是一个非常常见且简单的问题,但我似乎无法找到我正在寻找的内容

如果我有

var array = [{"a":4,"b":5, "d":6}, {"a":4, "c":5}, {"c":4}]

如何将对象相加得到

{"a":8,"b":5,"c":9, "d":6}

使用下划线、lodash 或其他相当快速和简单的方法单线

【问题讨论】:

    标签: javascript node.js underscore.js lodash


    【解决方案1】:

    您应该可以为此使用reduce

    var compact = array.reduce(function(prev,cur){
     for(var key in cur){
      if(!cur.hasOwnProperty(key))continue;
      if(prev.hasOwnProperty(key)){
       prev[key] += cur[key];
      }else{
       prev[key] = cur[key];
      }
     }
     return prev;
    },{});
    

    【讨论】:

    • 感谢特拉维斯的回答。有没有一种方法可以用下划线或 lodash 做到这一点?
    • @Leon:如果你不想使用标准 JavaScript,下划线有 _.reduce
    【解决方案2】:

    你可以结合spread()merge()add()来产生:

    _.spread(_.merge)([{}].concat(array, _.add));
    // → { a: 8, b: 5, d: 6, c: 13 }
    

    【讨论】:

    • 不知道它是如何工作的,但这是使用 lodash 的绝妙解决方案。
    • 任何人都可以解释这是如何工作的。我不明白 concat 如何帮助增加价值。
    【解决方案3】:

    你可以试试这个解决方案:

    var arr = [{"a":4,"b":5, "d":6}, {"a":4, "c":5}, {"c":4}];
    var result = {};
    arr.forEach(function(obj) {
      for(var prop in obj) {
        if(obj.hasOwnProperty(prop)) {
            result[prop] = (result[prop] || 0) + obj[prop];
        }
      }
    });
    
    $('#result').text(JSON.stringify(result,null,2));
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <div id="result"></div>

    【讨论】:

      【解决方案4】:

      _.merge 可以使用自定义回调:

      var array = [{"a": 4, "b": 5, "d": 6}, {"a": 4, "c": 5}, {"c": 4}];
      
      var result = _.merge.apply(null, array.concat([function(a, b) {
        if (typeof a === 'number') {
          return a + b;
        }
      }]));
      console.log(result);
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"&gt;&lt;/script&gt;

      【讨论】:

      • 这会改变array 的第一个元素,仅供参考。
      • @AdamBoduch:是的。应该可以通过在开头注入一个空对象来解决。
      【解决方案5】:

      从 lodash 4.0.0 开始,使用 mergeWith 很简单:

      _.mergeWith({}, ...array, _.add)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-28
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-17
        • 2016-12-23
        • 2020-09-14
        • 1970-01-01
        相关资源
        最近更新 更多