【问题标题】:Sum of same object name in javascriptjavascript中相同对象名称的总和
【发布时间】:2017-01-24 09:25:28
【问题描述】:

嗨朋友们,我是 javascript 的初学者,我如何将相同的 n 对象名称对应值相加并将结果推送到新数组。看看这是示例对象

var obj_1 ={'delivered':10,'due':11,'team_name':'UK'}; var obj_2 ={'delivered':10,'due':11,'team_name':'US'}; var obj_nth ={'delivered':10,'due':11,'team_name':'UK'};

但我希望这个输出 [UK:{'delivered':20,'due':22},US:{'delivered':10,'due':11}],所以请帮我下一步做什么

【问题讨论】:

  • 这些对象是否存储在数组中?还是只是不同的变量?
  • 放一些你试过的代码。
  • 是的,那些 obj 存储在一个数组中

标签: javascript jquery json object


【解决方案1】:

您可以先创建对象数组,然后reduce() 返回一个对象。

var obj_1 ={'delivered':10,'due':11,'team_name':'UK'};
var obj_2 ={'delivered':10,'due':11,'team_name':'US'};
var obj_nth ={'delivered':10,'due':11,'team_name':'UK'};

var result = [obj_1, obj_2, obj_nth].reduce(function(r, e) {
  if(!r[e.team_name]) {
    r[e.team_name] = {delivered:0,due:0}
  }
  r[e.team_name].delivered += e.delivered
  r[e.team_name].due += e.due
  return r
}, {})

console.log(result)

【讨论】:

  • 为什么是concat 而不仅仅是[o1, o2, o3]
【解决方案2】:
const newArray = initialArray.map(({team_name, ...restProps}) => {
  return {
    [team_name]: {...restProps}
  };
});

见:

【讨论】:

    【解决方案3】:
    var obj_1 ={'delivered':10,'due':11,'team_name':'UK'};
    var obj_2 ={'delivered':10,'due':11,'team_name':'US'};
    var obj_nth ={'delivered':10,'due':11,'team_name':'UK'};
    
    function sum_all() { 
        var sum={}; 
        for(var i=0;i<arguments.length;i++) { 
            obj = arguments[i]; 
            if (!sum[obj.team_name]) { 
                sum[obj.team_name]={'delivered':0,'due':0}; 
            } 
            sum[obj.team_name].delivered += obj.delivered; 
            sum[obj.team_name].due += obj.due;    
        } 
        return sum; 
    }
    
    var sum = sum_all(obj_1,obj_2,obj_nth);
    
    console.log(sum);
    

    您的控制台输出将是:

    sum
    Object
      UK: Object
          delivered: 20
          due: 22
    
      US: Object
          delivered: 10
          due: 11
    

    【讨论】:

      【解决方案4】:

      将这些对象存储在array 中,例如:

      var myObjects = [
          {'delivered':10,'due':11,'team_name':'UK'},
          {'delivered':10,'due':11,'team_name':'US'},
          {'delivered':10,'due':11,'team_name':'UK'}
      ];
      

      创建一个用于存储结果的新对象:

      var results = {};
      

      然后用for循环(as it is generally faster)遍历数组,根据team_name添加其他属性:

      for (var i = 0; i <= myObjects.length; i++) {
          if (typeof results[myObjects[i].team_name] !== undefined) {
              results[myObjects[i]].delivered += myObjects[i].delivered;
              results[myObjects[i]].due += myObjects[i].due; 
          } else {
              // Set 0 to these properties if the entry didn't exist
              results[myObjects[i]].delivered = 0;
              results[myObjects[i]].due = 0;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2012-07-13
        • 1970-01-01
        • 2022-01-09
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 1970-01-01
        相关资源
        最近更新 更多