【问题标题】:Sum all properties in object对对象中的所有属性求和
【发布时间】:2026-02-23 05:00:02
【问题描述】:

我有以下对象:

{"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"}

我想将所有这些值相加并打印出来。如何对属性值求和? :)

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:
    1. 使用for(var in) 遍历对象属性
    2. 使用parseInt,因为一些整数是字符串形式

    var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
    var sum = 0;
    
    for(var key in obj){
      sum += parseInt(obj[key]);
      }
    
    document.write(sum);

    【讨论】:

    • 最好不要使用document.write,使用函数并添加hasOwnProperty
    • @RaúlMartín document.write 是一种在代码 sn-p 中显示结果的简单方法。使用函数是提问者的工作。最后,为什么hasOwnProperty 给出了上面的代码?它会做什么?
    • 在 obj 中使用 key 的任何地方都会使用 hasOwnProperty,但您不知道对象的来源。您需要信任您的代码,以便将来重用它。
    • @RaúlMartín,但在这种情况下,我们确实知道对象的来源。它是 OP 代码中的那个。此外,我在我的分析器中使用var obj = 明确声明了它
    【解决方案2】:

    这是一种使用 ES5 的 Object.keysreduce 的方法:

    var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
    var sum = Object.keys(obj).reduce(function(prev, current, index) {
        return prev + (+obj[current]);
    }, 0);
    console.log(sum); // 746

    jsFiddle

    【讨论】:

    • 这是其他 6 个类似答案的不错选择! ^1
    • @AmmarCSE 谢谢。我认为这是一个有趣的问题需要解决,我想其他人也是如此!
    • 为什么不呢? Object.keys(obj).reduce(function (previous, key) { return previous + (parseInt(obj[key] || 0)); }, 0)
    • @RaúlMartín 没错,会保存三元组。更新答案
    【解决方案3】:

    我的 for-less 版本:

    var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
    
    function sumProperties(obj) {
       return Object.getOwnPropertyNames(obj)
       .map(function(item){ return +obj[item];})
       .reduce(function(acc,item) { return acc + item; });
    }
    
    document.write(sumProperties(obj));

    【讨论】:

    • 没看到这个。不错!
    【解决方案4】:

    给定

    var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional": 299}
    

    您可以使用 lodash 库非常轻松地做到这一点:

    var result = _.sum(obj);
    

    如果您的某些值不是数字,则需要先将它们映射到数字:

    var result = _.sum(_.map(obj, function(n){
         return +n;
         //or parseInt(n) or parseInt(n,10)
    }));
    

    http://plnkr.co/edit/UQs1aTCJ8qe1kG15G4x7?p=preview

    【讨论】:

    • 我对 lodash 4.17.10 进行了同样的尝试,它给出了零。 ?是版本问题吗
    【解决方案5】:

    你可以这样做:

    var sum_object = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
    var sum = 0;
    
    for( var index in sum_object ){
        sum += parseInt(sum_object[index]);
        console.log("Val: ",sum_object[index], sum);
    };
    
    console.log(sum);
    

    JSFiddle:http://jsfiddle.net/abvuh5m0/

    【讨论】:

      【解决方案6】:
      var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
      
      
      function sum(obj){
          var sum = 0;
          for(var key in obj){
            if (obj. hasOwnProperty(key)) {
                sum += parseInt(obj[key]) || 0;  
             }
          }
          return sum
      }
      
      console.log(sum(obj));
      

      parseInt(obj[key]) || 0; 很重要,值不是数字

      【讨论】:

        【解决方案7】:

        使用 Lodash:

        var obj = {"speed":299,"equipment":49,"teleabb":49,"additional":50,"optional":"299"};
        
        var val = _.sumBy(_.values(obj), function(v) {
           return parseInt(v)
        });
        

        示例:https://codepen.io/dieterich/pen/dyymoxM?editors=0012

        【讨论】:

          【解决方案8】:
          var sum = 0;
          for(var key in objects) {
              sum += parseInt(objects[key]);
          }
          console.log(sum);
          

          【讨论】:

          • 重复答案