Javascript对象按日、月、年分组

Javascript object group by day, month, year

我在网上搜索了一些示例,但没有找到一个像样的工作并完成我需要的简单任务,也许你可以帮助我。

我有一个对象数组:

[
  {
    "date": "2015-01-01T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": false,
    "isCompleted": true,
    "size": 1024
  },
  {
    "date": "2015-01-02T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": false,
    "isCompleted": false,
    "size": 1024
  },
  {
    "date": "2015-02-01T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": true,
    "isCompleted": false,
    "size": 1024
  },
  {
    "date": "2015-02-02T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": false,
    "isCompleted": true,
    "size": 1024
  },
  {
    "date": "2016-04-01T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": true,
    "isCompleted": false,
    "size": 1024
  },
  {
    "date": "2016-04-02T12:00:00.000Z",
    "photoUrl": "",
    "inProgress": false,
    "isCompleted": true,
    "size": 1024
  }
] 

我正在寻找一个简单直接的解决方案来按年分组,然后按月分组,然后按以下方式按天分组

结果应该是我可以像下面这样迭代的东西:

[
  {
    "2015": [
      {
        "JAN": [
          {
            "01": {
              "date": "2015-01-01T12:00:00.000Z",
              "photoUrl": "",
              "inProgress": false,
              "isCompleted": true,
              "size": 1024
            },
            "02": {
              "date": "2015-01-01T12:00:00.000Z",
              "photoUrl": "",
              "inProgress": false,
              "isCompleted": true,
              "size": 1024
            }
          }
        ],
        "FEB": [
          {
            "01": {
              "date": "2015-02-01T12:00:00.000Z",
              "photoUrl": "",
              "inProgress": false,
              "isCompleted": true,
              "size": 1024
            },
            "02": {
              "date": "2015-02-02T12:00:00.000Z",
              "photoUrl": "",
              "inProgress": false,
              "isCompleted": true,
              "size": 1024
            }
          }
        ]
      },
    ],
    "2016": [
      {
        "APR": [
          {
            "02": {
              "date": "2016-04-02T12:00:00.000Z",
              "photoUrl": "",
              "inProgress": false,
              "isCompleted": true,
              "size": 1024
            }
          }
        ]
      }
    ]
  }
]

最终目的是通过 ng-repeat 用 angular 在列表中遍历它。

如果有人有建议,我相信这段代码对其他人非常有用,因为没有示例将日期的平面数组转换为年、月、日的对象,在任何地方网.

非常感谢!

您可以只检查是否设置了年份,如果没有,则分配一个包含空对象的数组。然后继续月份,稍后将项目分配给它。

var data = [{ date: "2015-01-01T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2015-01-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: false, size: 1024 }, { date: "2015-02-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2015-02-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2016-04-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2016-04-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }],
    grouped = Object.create(null);

data.forEach(function (a) {
    var year = a.date.slice(0, 4),
        month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'][a.date.slice(5, 7) - 1],
        day = a.date.slice(8, 10);

    grouped[year] = grouped[year] || [{}];
    grouped[year][0][month] = grouped[year][0][month] || [{}];
    grouped[year][0][month][0][day] = a;
});

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

不幸的是,似乎没有办法进一步降低这一点,因为每个级别都有不同的 key/value 要求。

var data = [{"date":"2015-01-01T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2015-01-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":false,"size":1024},{"date":"2015-02-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2015-02-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2016-04-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2016-04-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024  }];
var months = [,"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"];
var re = /^(\d{4})-(\d{2})-(\d{2})/;
var results = data.reduce(function(results,value){
  var date = value.date.match(re);
  var temp = results;
  var key = date[1];
  if(!temp.hasOwnProperty(key)) temp[key] = {};
  temp = temp[key];
  key = months[date[2]|0];
  if(!temp.hasOwnProperty(key)) temp[key] = {};
  temp = temp[key];
  key = date[3];
  if(!temp.hasOwnProperty(key)) temp[key] = [];
  temp = temp[key];
  
  temp.push(value);
  return results;
},{});
console.log(results);
.as-console-wrapper { max-height: 100% !important; top: 0; }