如何按月对一组对象进行分组?

Per*_*vus 8 javascript group-by count date-range

我正在使用JavaScript.我有一个数组包含这种格式的数据:

[
        {"USER_NAME":"User1","LAST_SUCCESSFUL_CONNECT":"1373978337642"},
        {"USER_NAME":"User2","LAST_SUCCESSFUL_CONNECT":"1374515704026"},
        {"USER_NAME":"User3","LAST_SUCCESSFUL_CONNECT":"1374749782479"}
]
Run Code Online (Sandbox Code Playgroud)

(上面的数字代表UTC日期/时间,以毫秒为单位.

我想按月对数据进行分组(计数).像这样的东西:

[
    {"Month":"January, 2014","User_Count": 2},
    {"Month":"February, 2014","User_Count": 1},
]
Run Code Online (Sandbox Code Playgroud)

如果简化问题,我可以使用jQuery.

pyg*_*eek 13

这看起来像个map reduce问题.高级解决方案如下:

  1. 重新组织列表的成员.
  2. 数数吧.

以下是实现此目标的逐步操作方法:

地图

  1. 迭代字典列表
  2. 将datetime字符串转换为javascript datetime对象.
  3. 使用月份作为键和词典列表作为值.

这些现在按月份分组.

例:

var l = [...];
var o = {};
var f = function(x){
    var dt_object = Date(x["LAST_SUCCESSFUL_CONNECT"]); // convert to datetime object
    var key = dt_object.year + '-' + dt_object.month;

    if (o[key] === undefined) {
        var o[key] = [];
    };

    o[key].push(x)
}

_.map(l, f(x)) //apply f to each member of l
Run Code Online (Sandbox Code Playgroud)

降低

  1. 遍历包含列表字典的新对象.
  2. 计算每个字典列表的长度.
  3. 使用count的列表作为其价值的关键和长度.

例:

var g = function(member_count){
    //extra logic may go here
    return member_count
}

for member in o {
    count = _.reduce(l, g(member))
    member['count'] = count
}
Run Code Online (Sandbox Code Playgroud)

产生的API

o['month-year'] //for list of dictionaries in that month
o['month-year']['count'] //for the count of list of dictionaries in that month.
Run Code Online (Sandbox Code Playgroud)

参考文献:

对于mapreducejavascript中的函数,请参阅underscore.js:
http ://underscorejs.org/#map
http://underscorejs.org/#reduce

Javascript日期对象:https:
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

有关Date和DateTime对象的更多信息,请访问:https:
//en.wikipedia.org/wiki/ISO_8601

有关更多信息,请访问map reduce:https:
//en.wikipedia.org/wiki/MapReduce