JS按数组中月份日期值(对象)分组

mir*_*opé 1 javascript arrays grouping object

我的数组是这样的:

myArray = [
  {date: "2017-01-01", num: "2"}
  {date: "2017-01-02", num: "3"}
  {date: "2017-02-04", num: "6"}
  {date: "2017-02-05", num: "15"}
]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

myArray = [
   {group: "0", data: [
      {date: "2017-01-01", num: "2"}
      {date: "2017-01-02", num: "3"}]
   },
   {group: "1", data: [  
      {date: "2017-02-04", num: "6"}
      {date: "2017-02-05", num: "15"}]
   },
]
Run Code Online (Sandbox Code Playgroud)

基本上,按月日期键分组。

Sta*_*kin 7

专业解决方案(单线):

如果您还没有Lodash (与Underscore JS相同),请将其添加到您的 JS 中,如下所示:

使用 NPM 安装:npm i --save lodash

解决方案代码:

我将向您展示 Lodash(或 Underscore.js)中的一个漂亮的衬线

const _ = require('lodash');
let myArray = [
  {date: "2017-01-01", num: "2"},
  {date: "2017-01-02", num: "3"},
  {date: "2017-02-04", num: "6"},
  {date: "2017-02-05", num: "15"}
]

// The one liner
_.groupBy(myArray, ({date})=> new Date(date).getMonth());
Run Code Online (Sandbox Code Playgroud)

这是回应:

{
    "0": [
           {
            "date": "2017-01-01",
            "num": "2"
           },
           {
            "date": "2017-01-02",
            "num": "3"
           }
    ],
    "1": [
           {
            "date": "2017-02-04",
            "num": "6"
           },
           {
            "date": "2017-02-05",
            "num": "15"
           }
    ]
}
Run Code Online (Sandbox Code Playgroud)

按引用分组


Rom*_*est 5

使用该溶液Array.prototype.reduceString.prototype.splitArray.prototype.map功能:

var myArray = [
    {date: "2017-01-01", num: "2"},
    {date: "2017-01-02", num: "3"},
    {date: "2017-02-04", num: "6"},
    {date: "2017-02-05", num: "15"}
],
    groupKey = 0;
    groups = myArray.reduce(function (r, o) {
        var m = o.date.split(('-'))[1];
        (r[m])? r[m].data.push(o) : r[m] = {group: String(groupKey++), data: [o]};
        return r;
    }, {});

var result = Object.keys(groups).map(function(k){ return groups[k]; });

console.log(result);
Run Code Online (Sandbox Code Playgroud)