对包含日期数组的对象数组进行排序
Sort an array of objects containing a date array
我目前正在尝试对一组对象进行排序,每个对象都包含一组日期。数据结构如下所示:
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:
在您的测试数据中,日期已经排序,因此这可能会扭曲您对已经发生的事情的看法。
我重新排序了测试数据,以便它们开始未排序,然后稍微更改了您的排序,以便它 returns 要么是 -1 要么是 1(排序函数应该是 returning):
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)
关于你关于 returning 的说明——如果你使用 {}
来包装你的函数体,你应该在大括号内使用 return
。您会注意到,在我的排序函数中,没有任何大括号——在这种情况下,单行函数中的 return 值是自动获取的。
试试这个:
const array = [
{
name: "Judith",
cal: {
ti: [
"2021-03-16T14:00:00Z",
"2021-03-09T15:00:00Z",
"2021-03-09T15:30:00Z",
"2021-03-19T15:30:00Z",
"2021-02-19T15:30:00Z",
]
}
},
{
name: "billy",
cal: {
ti: [
"2021-03-08T14:00:00Z",
"2021-03-05T14:30:00Z",
"2021-02-25T14:30:00Z",
"2021-03-25T14:30:00Z",
"2021-03-08T14:30:00Z"
]
}
}
];
const now = new Date();
array.forEach(i => i.cal.ti.sort((a, b) =>
Math.abs(new Date(a) - now)
- Math.abs(new Date(b) - now)
));
array.sort((a, b) =>
Math.abs(new Date(a.cal.ti[0]) - now)
- Math.abs(new Date(b.cal.ti[0]) - now)
);
console.log(array);
我目前正在尝试对一组对象进行排序,每个对象都包含一组日期。数据结构如下所示:
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:
在您的测试数据中,日期已经排序,因此这可能会扭曲您对已经发生的事情的看法。
我重新排序了测试数据,以便它们开始未排序,然后稍微更改了您的排序,以便它 returns 要么是 -1 要么是 1(排序函数应该是 returning):
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)
关于你关于 returning 的说明——如果你使用 {}
来包装你的函数体,你应该在大括号内使用 return
。您会注意到,在我的排序函数中,没有任何大括号——在这种情况下,单行函数中的 return 值是自动获取的。
试试这个:
const array = [
{
name: "Judith",
cal: {
ti: [
"2021-03-16T14:00:00Z",
"2021-03-09T15:00:00Z",
"2021-03-09T15:30:00Z",
"2021-03-19T15:30:00Z",
"2021-02-19T15:30:00Z",
]
}
},
{
name: "billy",
cal: {
ti: [
"2021-03-08T14:00:00Z",
"2021-03-05T14:30:00Z",
"2021-02-25T14:30:00Z",
"2021-03-25T14:30:00Z",
"2021-03-08T14:30:00Z"
]
}
}
];
const now = new Date();
array.forEach(i => i.cal.ti.sort((a, b) =>
Math.abs(new Date(a) - now)
- Math.abs(new Date(b) - now)
));
array.sort((a, b) =>
Math.abs(new Date(a.cal.ti[0]) - now)
- Math.abs(new Date(b.cal.ti[0]) - now)
);
console.log(array);