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; }
我在网上搜索了一些示例,但没有找到一个像样的工作并完成我需要的简单任务,也许你可以帮助我。
我有一个对象数组:
[
{
"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; }