【问题标题】:Javascript - underscorejs map reduce groupby based on dateJavascript - underscorejs 映射根据日期减少 groupby
【发布时间】:2013-05-24 21:03:49
【问题描述】:

我正在一个项目中使用 underscorejs。我需要做不同类型的数组操作,比如 map、reduce、filter groupby。

我的数据集如下所示:

var data_list = [
     {"insertDate": "2011-12-02T00:00","value": {"paisa":10000}},
    {"insertDate": "2013-03-02T00:00","value": {"paisa":10000}
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":10000}
    },{"insertDate": "2012-12-02T00:00","value": {"paisa":30000}},
  {"insertDate": "2013-04-02T00:00","value": {"paisa":10000},
    },{"insertDate": "2013-04-02T00:00","value": {"paisa":30000}
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":20000}},
  {"insertDate": "2013-04-12T00:00","value": {"paisa":30000}
    },
    {"insertDate": "2012-11-02T00:00","value": {"paisa":10000}}
]

我想根据日、月和年计算数据。 对于日计算,我正在做 groupby,然后使用 map reduce 进行计算。 如下:

var groupedByDateData = _.groupBy(data_list, "insertDate");
var aggregateByDate = _.map(groupedByDateData, function(invoiceObject, createdat) {
  return { 
     createdat: createdat, 
     val: _.reduce(invoiceObject, function(m,x) { 
       return m + x.value.paisa;
     }, 0) 
  };
});

它对于基于天的地图减少工作正常,但对于月份和年份计算,我想以与可读代码相同的格式进行。

如何使用 underscorejs 进行 map、reduce,以便获得如下数据: 每月计算:

[{"createdat": "February 2011", "val": 10000}, 
{"createdat": "March 2013", "val": 40000}, 
{"createdat": "December 2012", "val": 30000}, 
{"createdat": "April 2013", "val": 70000}, 
{"createdat": "November 2012", "val": 10000}]

对于每年的 mapreduce:

[{"createdat": "2011", "val": 10000}, 
{"createdat": "2013", "val": 110000}, 
{"createdat": "2012", "val": 70000}]

我的代码JSBIN在这里

注意:为了获得每年和每月减少的结果集,我将日期分开,但这不是最好的做法。 在这里查看我的解决方案http://jsbin.com/etepan/3/edit

提前致谢。

【问题讨论】:

    标签: javascript arrays group-by mapreduce underscore.js


    【解决方案1】:

    您会希望按不同的事物(时间、月份、年份)进行分组,因此关键在于 groupBy

    你正在使用这个:

    var groupedByDateData = _.groupBy(data_list, "insertDate");
    

    简写为:

    var groupedByDateData = _.groupBy(data_list, function(item) {
      return item.insertDate; // returns "YYYY-MM-DDT00:00"
    });
    

    通过修改这个函数,你可以改变你得到的分组。例如,年份:

    var groupedByDateData = _.groupBy(data_list, function(item) {
      // pretty crappy way of getting the year,
      // but luckily the dates are structured
      return item.insertDate.substring(0,4); 
    });
    
    // => [
    //      {"createdat": "2011", "val": 10000},
    //      {"createdat": "2012", "val": 40000},
    //      {"createdat": "2013", "val": 110000}
    //    ]
    

    月份:

    var groupedByDateData = _.groupBy(data_list, function(item) {
      return item.insertDate.substring(0,7); 
    });
    
    // => [
    //      {"createdat": "2011-12", "val": 10000},
    //      {"createdat": "2013-03", "val": 40000},
    //      {"createdat": "2012-12", "val": 30000},
    //      {"createdat": "2013-04", "val": 70000},
    //      {"createdat": "2012-11", "val": 10000}
    //    ]
    

    你的 JS Bin 帮了大忙:http://jsbin.com/ucohoq/7/edit

    【讨论】:

    • 在你发布之前我已经这样做了,在这里检查jsbin.com/etepan/3/edit 但是“item.insertDate.substring(0,4);”似乎不太好,我做了同样的事情,比如 obj.insertDate.split('-')[0] 这也很奇怪。
    • 对于日期解析,我通常使用 moment.js,因为它有一个合理的 API 并且可以很好地格式化日期。您可以在 aggregateByDate 函数的返回值中使用它(而不是按原样吐出 createdat
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多