Javascript - underscorejs map reduce groupby 基于日期

标签 javascript arrays group-by mapreduce underscore.js

我在项目中使用 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) 
  };
});

它适用于基于天的 map reduce,但对于月份和年份的计算,我想以与代码可读相同的格式进行计算。

如何使用 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

提前致谢。

最佳答案

您需要按不同的事物(时间、月份、年份)进行分组,因此关键在 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

关于Javascript - underscorejs map reduce groupby 基于日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16743628/

相关文章:

javascript - 将对象属性保存到数组时出现奇怪的重复

mysql - 分组后消除某些重复的行

mysql - SQL 帮助。如何在同一行排列值,向上移动一列?

mysql - SQL:使用两个不同的查询进行分组

arrays - 追加包含其他类数组的类数组

c++ - 数组和指针没有意义

javascript - 如何使用 jQuery 将悬停添加到任何 CTA

javascript - 如何在 Three.js 中使用延迟光照

javascript - .NET MVC : Finding default Bootsrap JavaScripts

javascript - 为什么自动绑定(bind)的 Prop 会在运行时通过 propTypes 产生警告消息?