首页 > 解决方案 > 在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的新手

标签: javascript

解决方案


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);
});

推荐阅读