JavaScript对象按天、月、年分组

4

我正在开发一款应用程序,需要对不同的JavaScript对象进行分组,这些分组将基于月份、日期和年份。

对于日期,我的处理方式如下:

var calculateByDay = function(inputList){
        var outPutList = [];    
        var result = {}
        var item = null, key = null;
        for(i=0; c<inputList.length; i++) {
           item=inputList[c];
           key = Object.keys(item)[0];
           item=item[key];
           if(!result[key]) {
                result[key] = item;
            }
           else {
            result[key] += item;
        }
        for (r in result)
            {
                var docs = {};
                docs["date"] = r;
                docs["amount"] = result[r];
                outPutList.push(docs);
            }

        }
        return outPutList;
    }

如何改进上述代码并将其用于月份和年份的计算?我查看了underscore.js,它有一个groupBy方法,但似乎不符合我的要求。我想按月份和年份进行分组。

var inputList = [{"2012-12-02T00:00": 2000}, {"2013-01-01T00:00": 1200},{"2013-02-02T00:00": 550}, {"2013-02-02T00:00": 1000}];

输出应该是:
Monthly :
[{"December 2012": 2000}, {"January 2013": 1200},{"February 2013": 1550}];
Yearly
[{"year 2012": 2000}, {"year 2013": 2750}];

我需要使用类似map、reduce的方法来处理大数据(数组集合),除此之外,还有其他库或实践方法可以使代码更加稳定吗?请注意,不要删除任何HTML标签。谢谢。
2个回答

21

考虑到数据的稍微不同的结构:

var data = [{
  "date": "2011-12-02T00:00",
  "value": 1000
}, {
  "date": "2013-03-02T00:00",
  "value": 1000
}, {
  "date": "2013-03-02T00:00",
  "value": 500
}, {
  "date": "2012-12-02T00:00",
  "value": 200
}, {
  "date": "2013-04-02T00:00",
  "value": 200
}, {
  "date": "2013-04-02T00:00",
  "value": 500
}, {
  "date": "2013-03-02T00:00",
  "value": 500
}, {
  "date": "2013-04-12T00:00",
  "value": 1000
}, {
  "date": "2012-11-02T00:00",
  "value": 600
}];

你可以使用下划线:

var grouped = _.groupBy(data, function(item) {
    return item.date;
});

var groupedByYear = _.groupBy(data, function(item) {
    return item.date.substring(0,4);
});

var groupedByMonth = _.groupBy(data, function(item) {
    return item.date.substring(0,7);
});

console.log(groupedByYear);

请参考相关回答:Javascript - underscorejs根据日期进行map reduce groupby


2
请看下面的重构是否对您有用 http://jsfiddle.net/wkUJC/
var dates = [{"2012-12-02T00:00": 2000}, {"2013-01-01T00:00": 1200},{"2013-02-02T00:00": 550}, {"2013-02-02T00:00": 1000}];

function calc(dates) {
    var response = {};
    dates.forEach(function(d){
        for (var k in d) {
            var _ = k.split("-");
            var year = _[0]
            var month = _[1]
            if (!response[year]) response[year] = {total: 0}
            response[year][month] = response[year][month] ? response[year][month]+d[k] : d[k]
            response[year].total+= d[k]
        }
    });
    console.log(response);
    return response;
}

calc(dates);

顺便说一下,我想要一个数组作为响应。 - arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接