首页 > 解决方案 > Javascript - 使用 lambda 按日期分组对象数组

问题描述

我有一组消息对象,比如这个:

const messages = [
   {
     id: "messageId",
     text: "Hello!",
     date: new Date("2021/01/01")
   },
   {
     id: "messageId",
     text: "Same day!",
     date: new Date("2021/01/01")
   },
   {
     id: "messageId",
     text: "Another day!",
     date: new Date("2021/01/02")
   },
];

如您所见,每个对象都有一个原生的 JS 日期。如何使用 JavaScript lambda 按天将所有这些对象分组到一个数组中?这是预期的结果:

 [
   {
     day: new Date("2021/01/01"),
     data: [
       {
          id: "messageId",
          text: "Hello!",
       },
       {
          id: "messageId",
          text: "Same day!",
       },
     ]
   },
   {
     day: new Date("2021/01/02"),
     data: [
       {
          id: "messageId",
          text: "Another day!",
       },
     ]
   },
];

标签: javascriptecmascript-6

解决方案


您可以使用reduceobject 首先创建对象并按日期(年-月-日)分组,然后使用Object.values从该对象获取数组。

const messages = [
   {
     id: "messageId",
     text: "Hello!",
     date: new Date("2021/01/01")
   },
   {
     id: "messageId",
     text: "Same day!",
     date: new Date("2021/01/01")
   },
   {
     id: "messageId",
     text: "Another day!",
     date: new Date("2021/01/02")
   },
];

const object = messages.reduce((r, { date: day, ...rest }) => {
  const key = `${day.getFullYear()}-${day.getMonth()}-${day.getDate()}`
  if (!r[key]) r[key] = {day, data: [rest]}
  else r[key].data.push(rest)
  return r;
}, {})

const result = Object.values(object)

console.log(result)


推荐阅读