对包含日期数组的对象数组进行排序

时间:2021-03-05 22:26:32

标签: javascript momentjs dayjs

我目前正在尝试对一个对象数组进行排序,每个对象都包含一个日期数组。数据结构如下所示:

const array = [
  {
    name: "Judith",
    cal: {
      ti: [
        "2021-03-09T15:00:00Z",
        "2021-03-09T15:30:00Z",
        "2021-03-16T14:00:00Z"
      ]
    }
  },
  {
    name: "billy",
    cal: {
      ti: [
        "2021-03-05T14:30:00Z",
        "2021-03-08T14:00:00Z",
        "2021-03-08T14:30:00Z"
      ]
    }
  }
]

我正在尝试使用名为 dayjs 的日期库根据目前最近的可用时间对数组进行排序。我正在尝试使用 dayjs 包中的 diff 方法比较每个日期数组,如下所示:

const test = array.map(i => i.cal.ti.sort((a, b) => {
 dayjs(a).diff(dayjs(b))
}))

console.log(test)

我想对数组中包含的对象进行排序,首先返回具有最近可用时间的对象,依此类推。我注意到我在排序中错误地返回,我相信我也有一堆问题,我没有正确比较日期导致我的排序失败。

附上一个用于调试的repl.it:

https://repl.it/@rterrell25/LegalJaggedCoordinate#index.js

2 个答案:

答案 0 :(得分:1)

在您的测试数据中,日期已经排序,因此这可能会扭曲您对已经发生的事情的看法。

我对测试数据重新排序,使它们开始未排序,然后稍微更改排序,使其返回 -1 或 1(这是排序函数应该返回的):

const array = [
  {
    name: "Judith",
    cal: {
      ti: [
        "2021-03-16T14:00:00Z",
        "2021-03-09T15:00:00Z",
        "2021-03-09T15:30:00Z",
      ]
    }
  },
  {
    name: "billy",
    cal: {
      ti: [
        "2021-03-08T14:00:00Z",
        "2021-03-05T14:30:00Z",
        "2021-03-08T14:30:00Z"
      ]
    }
  }
]
const test = array.map(i => i.cal.ti.sort((a, b) => (dayjs(a).isAfter(dayjs(b)) ? 1 : -1)))
 
 console.log(test)

更新

const test = array.sort((a,b) => {
  let aFirst = a.cal.ti.map(i => dayjs(i)).sort((a1,b1) => a1.isAfter(b1) ? 1 : -1)[0]
  let bFirst = b.cal.ti.map(i => dayjs(i)).sort((a1,b1) => a1.isAfter(b1) ? 1 : -1)[0]
  return aFirst.isAfter(bFirst) ? 1 : -1
})
 console.log(test)

这种对 dayjs 对象进行排序的方法来自此处的建议 (https://github.com/iamkun/dayjs/issues/328)

关于返回的注意事项——如果您使用 {} 包装函数体,则应该在大括号内使用 return。您会注意到,在我的排序函数中,没有任何大括号——在这种情况下,单行函数的返回值是自动获取的。

答案 1 :(得分:1)

试试这个:

*/15 * * * 1-4
*/15 1-23 * * 5
*/15 19-23 * * 7