分组(按年份)和javascript集合中的总和

时间:2015-07-24 21:27:14

标签: javascript underscore.js

我想在节点javascript应用程序中将每年的单个值中的同一个值相加。我想避免for(;;)迭代,发现年份,总结值....
也许Underscore库中有一些东西(比如_.groupBy但是我无法想象如何在这个中使用它情况)。
json数据是这个(即季度收入数据):

 { "data":
 ["2015",sum of all 2015 data],
 ["2014",sum of all 2014 data],
 ["2013",sum of all 2013 data],
 [etc...]}

结果应该是:

myfun <- function(...) which(c(...))

# examples
myfun(TRUE,FALSE,TRUE)
# [1] 1 3
myfun(FALSE,FALSE,TRUE,TRUE,FALSE,TRUE)
# [1] 3 4 6

3 个答案:

答案 0 :(得分:1)

完全没问题,没有循环,也没有下划线。

a = { "data":[
 ["2015-07-22",125677000000.0],
 ["2015-04-28",129006000000.0],
 ["2015-01-28",123328000000.0],
 ["2014-10-27",111547000000.0],
 ["2014-07-23",120940000000.0],
 ["2014-04-24",120178999999.99998],
 ["2014-01-28",129684000000.0],
 ["2013-10-30",123549000000.0],
 ["2013-07-24",123354000000.00002],
 ["2013-04-24",135490000000.0],
 ["2013-01-24",127346000000.0],
 ["2012-10-31",118210000000.0]]}


var years = a.data.map(function(d) {
    return [new Date(d[0]).getFullYear(), d[1]];
 });

var sums = years.reduce(function(prev, curr, idx, arr) {
    var sum = prev[curr[0]];
    prev[curr[0]] = sum ? sum + curr[1] : curr[1];
    return prev; 
 }, {});

> sums
Object {2012: 118210000000, 2013: 509739000000, 2014: 482350000000, 2015: 378011000000}

请注意,我必须修复您的JSON数据。你发布的那个是无效的JSON,所以我只是在列表列表中添加了数组括号。

如果你愿意,你甚至可以在一行中完成。

a.data.map(function(d) { return [new Date(d[0]).getFullYear(), d[1]]; }).reduce(function(prev, curr, idx, arr) { var sum = prev[curr[0]]; prev[curr[0]] = sum ? sum + curr[1] : curr[1]; return prev; }, {});

开个玩笑,请不要那样做:)

答案 1 :(得分:0)

现在您提到下划线,迭代一次并调用索引

{{1}}

是的,正如@bbill指出的那样,我也修复了你的JSON:)

以下是JSFiddle

答案 2 :(得分:0)

var data = [
    ["2015-07-22",125677000000.0],
    ["2015-04-28",129006000000.0],
    ["2015-01-28",123328000000.0],
    ["2014-10-27",111547000000.0],
    ["2014-07-23",120940000000.0],
    ["2014-04-24",120178999999.99998],
    ["2014-01-28",129684000000.0],
    ["2013-10-30",123549000000.0],
    ["2013-07-24",123354000000.00002],
    ["2013-04-24",135490000000.0],
    ["2013-01-24",127346000000.0],
    ["2012-10-31",118210000000.0]
];

在地图中创建总和(年 - >总和) - 然后将地图转换为包含_.pairs的数组:

var result = _.pairs(data.reduce(function(prev, curr) {
    var year = curr[0].substr(0, 4);
    prev[year] = prev[year] ? prev[year] + curr[1] : curr[1];
    return prev;
}, {}));

然后按第一个元素排序,降序:

result.sort(function(a, b) { return a[0] < a[1]; });