试图获得每个对象的总和

时间:2015-02-24 13:12:53

标签: javascript arrays angularjs

我一直试图解决这个问题,但我似乎无处可去。基本上我有一个输出的JSON。

[
      {
"gosuResponse" : {
"tokenId" : "60e2d532-3d1c-4a95-adbd-aa352984c125",
"page" : 1,
"pageSize" : 1000,
"nbLinesTotal" : 15,
"serials" : {
  "serial" : [ "272072207980" ]
},
"data" : {
  "row" : [ {
    "col" : [ "2015-02-10", "", "1"]
  }, {
    "col" : [ "2015-02-10", "BNP-Blogs", "1504"]
  }, {
    "col" : [ "2015-02-10", "BNP", "66"]
  }, {
    "col" : [ "2015-02-10", "GOOMPlayer-Site", "6"]
  }, {
    "col" : [ "2015-02-10", "podcast", "19"]
  }, {
    "col" : [ "2015-02-10", "stream", "10"]
  }, {
    "col" : [ "2015-02-09", "", "6"]
  }, {
    "col" : [ "2015-02-09", "BNP-Blogs", "1742"]
  }, {
    "col" : [ "2015-02-09", "BNP", "61"]
  }, {
    "col" : [ "2015-02-09", "GOOMPlayer-Site", "2"]
  }, {
    "col" : [ "2015-02-09", "podcast", "18"]
  }, {
    "col" : [ "2015-02-09", "stream", "8"]
  }, {
    "col" : [ "2015-02-08", "", "7"]      
  }, {
    "col" : [ "2015-02-01", "stream", "8"]
  } ]
 }
}
}
]

由于名称相似,我使用underscore.js将它们组合在一起

var items = result[0].gosuResponse.data.row;

    var groups = _(items).groupBy(function(o) {
        return o.col[1];
    });
    console.log(groups);

此输出,

Object 
 - BNP : Array[4]
   - 0 : Object
     - col : Array[3]
       0 : '2015-02-10"
       1 : 'BNP'
       2:  '66'
   - 1 : Object
     - col : Array[3]
       0 : '2015-02-10"
       1 : 'BNP'
       2:  '66'

我正在尝试为每个对象添加位置2中的数字值。

我在Plunkr中用一把钥匙进行了测试,但我想知道是否有办法为所有对象做到这一点?

我的Plunkr http://plnkr.co/edit/nNwNoAiUz4PKV8ucaPc1?p=preview

1 个答案:

答案 0 :(得分:1)

我认为没有理由对项目进行分组:

var sum = {};
_.each(items, function(row) {
  var col = row.col;
  if (sum.hasOwnProperty(col[1])) {
    sum[col[1]] += parseInt(col[2]) || 0;
  } else {
    sum[col[1]] = parseInt(col[2]) || 0;
  }
});

但请注意,我对underscore.js相对较新,对其特定技巧并不了解。

更新: 我还找到了一个使用组的本地underscore.js解决方案:

var groups = _(items).groupBy(function(o) {
    return o.col[1];
});

var sum2 = {};
_.each(groups, function(group, key) {
  sum2[key] = _.reduce(group, function(memo, item) {
    return memo + (parseInt(item.col[2]) || 0);
  }, 0);
});