admin管理员组文章数量:1292870
I have an array of objects that contain data like this
[{
date: "01-01-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-02-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-15-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-15-2018 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2018 00:00:00",
dataField1: "",
dataField2: ""
}]]
UPD: need to sort by year and month, not just month. I need to split it into an array of arrays where objects are grouped by weeks and years. something like this:
[
[{
date: "01-01-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-02-2017 00:00:00",
dataField1: "",
dataField2: ""
}
],
[{
date: "01-15-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2017 00:00:00",
dataField1: "",
dataField2: ""
}],
[
{
date: "01-15-2018 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2018 00:00:00",
dataField1: "",
dataField2: ""
}
]
]
is there a simple way with good performance to make this sorting with javascript?
I have an array of objects that contain data like this
[{
date: "01-01-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-02-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-15-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-15-2018 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2018 00:00:00",
dataField1: "",
dataField2: ""
}]]
UPD: need to sort by year and month, not just month. I need to split it into an array of arrays where objects are grouped by weeks and years. something like this:
[
[{
date: "01-01-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-02-2017 00:00:00",
dataField1: "",
dataField2: ""
}
],
[{
date: "01-15-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2017 00:00:00",
dataField1: "",
dataField2: ""
}],
[
{
date: "01-15-2018 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2018 00:00:00",
dataField1: "",
dataField2: ""
}
]
]
is there a simple way with good performance to make this sorting with javascript?
Share Improve this question edited Feb 14, 2018 at 15:17 Alexander Demianenko asked Feb 14, 2018 at 13:17 Alexander DemianenkoAlexander Demianenko 1241 silver badge12 bronze badges 2-
3
if using lodash then _.groupBy else use lodash
;) – georg Commented Feb 14, 2018 at 13:21 - If you want to stick to vanilla JS, then you can iterate through the list of data, and put it into an object/map where the key is the number of the week. This isn't a "sorting" thing, this is a "grouping" thing. What have you tried so far? Post some code, please. – TheCrzyMan Commented Feb 14, 2018 at 13:35
2 Answers
Reset to default 9If you'll consider using something like momentjs, you can use the format function. This way you can actually group by any of the available date format tokens listed here.
function datesGroupByComponent(dates, token) {
return dates.reduce(function(val, obj) {
let p = moment(obj['date'], 'MM/DD/YYYY').format(token);
(val[p] = val[p] || []).push(obj);
return val;
}, {});
}
const dates = [
{ date: "01-01-2017 00:00:00" },
{ date: "01-02-2017 00:00:00" },
{ date: "01-15-2017 00:00:00" },
{ date: "01-16-2017 00:00:00" }
];
/* https://momentjs./docs/#/displaying/format */
console.log('D', datesGroupByComponent(dates, 'D')); // Day of Month
console.log('w', datesGroupByComponent(dates, 'w')); // Week of Year
console.log('W', datesGroupByComponent(dates, 'W')); // Week of Year (ISO)
<script src="https://cdnjs.cloudflare./ajax/libs/moment.js/2.18.1/moment.min.js"></script>
I just so happened to have some code on hand to determine the ISO-8601 Week number.
From there it's just a matter of splitting the date string into usable parts that can be passed to the native Date
constructor, then reduce
the object down to something with keys so we can put the dates in the correct group, and finally, drop the keys to make it an array, as you requested, using Object.values()
.
var dates = [{
date: "01-01-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-02-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-15-2017 00:00:00",
dataField1: "",
dataField2: ""
},
{
date: "01-16-2017 00:00:00",
dataField1: "",
dataField2: ""
}
];
var group = Object.values(dates.reduce((acc, val) => {
var dateparts = val.date.split(/ |-|:/g);
var date = new Date(dateparts[2], dateparts[0] - 1, dateparts[1], dateparts[3], dateparts[4], dateparts[5]);
var weekNo = getISO8601WeekNo(date);
if (!acc[weekNo]) acc[weekNo] = [];
acc[weekNo].push(val);
return acc;
}, {}));
console.log(group);
function getISO8601WeekNo(date) {
var startDate = new Date(date.getFullYear(), 0);
var endDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
while (endDate.getDay() < 6) endDate.setDate(endDate.getDate() + 1);
endDate = endDate.getTime();
var weekNo = 0;
while (startDate.getTime() < endDate) {
if (startDate.getDay() == 4) weekNo++;
startDate.setDate(startDate.getDate() + 1);
}
return weekNo;
}
本文标签: javascriptSplit array of objects into groups by weekStack Overflow
版权声明:本文标题:javascript - Split array of objects into groups by week - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741564482a2385643.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论