用Javascript按月份分组日期



如何在Javascript 中对日期数组进行分组,以获得按月份分组日期的新对象数组

我有:

const arr = [
Date Sat Dec 31 2016 01:00:00 GMT+0100 (Central European Standard Time),
​Date Sun Jan 01 2017 01:00:00 GMT+0100 (Central European Standard Time),
​Date Mon Jan 02 2017 01:00:00 GMT+0100 (Central European Standard Time),
Date Tue Jan 31 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Wed Feb 01 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Thu Feb 02 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Fri Feb 03 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Sat Feb 04 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Sun Feb 05 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Mon Feb 06 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Tue Feb 07 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Wed Feb 08 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Thu Feb 09 2017 01:00:00 GMT+0100 (Central European Standard Time),
​​Date Fri Feb 10 2017 01:00:00 GMT+0100 (Central European Standard Time),
]

我想得到:

const nArr = [
{
name: December,
dates:[
Date Sat Dec 31 2016 01:00:00 GMT+0100 (Central European Standard Time)
]
},
{
name: January,
dates:[
​        Date Sun Jan 01 2017 01:00:00 GMT+0100 (Central European Standard Time),
​        Date Mon Jan 02 2017 01:00:00 GMT+0100 (Central European Standard Time),
Date Tue Jan 31 2017 01:00:00 GMT+0100 (Central European Standard Time),
]
}
....
]

我试着使用阵列缩减器,但我对它有问题

arr.reduce((acc, val) => {
const d = new Date(val)
let m = months[d.getMonth()]
acc[m] = acc[m]
acc[m].push(val)
return acc
}, [])

谢谢你的帮助,我是JS 的新手

const dates = [new Date(), new Date()];
const months = [
"January",
"February",
"March",
"April",
"May", 
"June",
"July",
"August",
"September",
"October",
"November",
"December"
];
const sortedDates: Array<{name: string, dates: Array<Date>}> = [];
dates.map(date => {
const month = months[date.getMonth()];
const monthObj = sortedDates.find(datesByMonth => datesByMonth.name === month)

if (monthObj === undefined) {
sortedDates.push({
name: month,
dates: [
date
]
})
return;
}
monthObj.dates.push(date);
});

我不是专家,但就是这样解决的

const arr = [
new Date('Date Sat Dec 31 2016 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Sun Jan 01 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Mon Jan 02 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Tue Jan 31 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Wed Feb 01 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Thu Feb 02 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Fri Feb 03 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Sat Feb 04 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Sun Feb 05 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Mon Feb 06 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Tue Feb 07 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Wed Feb 08 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Thu Feb 09 2017 01:00:00 GMT+0100 (Central European Standard Time'),
new Date('Date Fri Feb 10 2017 01:00:00 GMT+0100 (Central European Standard Time'),
];
let months = [];
for (var i = 0; i < arr.length; i++) {
var month = arr[i].getMonth();
if (!months[month]) {
months[month] = [];
}
months[month].push(arr[i]);
}
console.log(months);

您可以获得完整的月份"name";通过使用month:long选项格式化区域设置字符串。

const toLongMonth = (date) =>
date.toLocaleString('en-US', { month: 'long' });
const groupBy = (arr, fn) => arr.reduce((acc, item) =>
(month => ({
...acc,
[month]: [ ...(acc[month] || []), item ]
}))
(fn(item)), {});
const groupByMonth = (dates) =>
Object.entries(groupBy(dates, toLongMonth))
.map(([name, dates]) => ({ name, dates }))
const dates = [
new Date('Sat Dec 31 2016 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Sun Jan 01 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Mon Jan 02 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Tue Jan 31 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Wed Feb 01 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Thu Feb 02 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Fri Feb 03 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Sat Feb 04 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Sun Feb 05 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Mon Feb 06 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Tue Feb 07 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Wed Feb 08 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Thu Feb 09 2017 01:00:00 GMT+0100 (Central European Standard Time)'),
new Date('Fri Feb 10 2017 01:00:00 GMT+0100 (Central European Standard Time)')
];
console.log(groupByMonth(dates));
.as-console-wrapper { top: 0; max-height: 100% !important; }

最新更新