我在根据当前时间按时间对象对数组进行排序时遇到问题。该代码有时有效,但有时无效。我的代码有什么错误,或者有更好的排序方法吗?
const sortTimeFromNow = (timenow,array) => {
array.sort();
let index = array.findIndex((s) => {
return s.day.sched[0].time.start > timenow;
});
index -= index && 1;
return index ? [...array.slice(index), ...array.slice(0, index)] : array;
};
这个想法是这样排序的:
示例时间
<块引用>const timenow = new Date() //sample '09:45:33'
阵列调度
const array = [
{"t":"evtA","sched":[{"day":"TUE","time":{"start":"20:00:35","end":"21:30:39"},"allday":false}] },
{"t":"evtB","sched":[{"day":"TUE","time":{"start":"06:00:59","end":"14:00:59"},"allday":false}] },
{"t":"evtC","sched":[{"day":"TUE","time":{"start":"15:00:59","end":"16:00:21"},"allday":false}] },
{"t":"evtD","sched":[{"day":"TUE","time":{"start":"14:00:59","end":"15:00:21"},"allday":false}] }
]
调用函数
<块引用>const 结果 = sortTimeFromNow(timenow,array)
样本结果应该是
//Example1 '09:45:33'
[
{"t":"evtB","sched":[{"day":"TUE","time":{"start":"06:00:59","end":"14:00:59"},"allday":false}] },
{"t":"evtD","sched":[{"day":"TUE","time":{"start":"14:00:59","end":"15:00:21"},"allday":false}] },
{"t":"evtC","sched":[{"day":"TUE","time":{"start":"15:00:59","end":"16:00:21"},"allday":false}] },
{"t":"evtA","sched":[{"day":"TUE","time":{"start":"20:00:35","end":"21:30:39"},"allday":false}] },
]
//Example2 '15:01:00'
[
{"t":"evtC","sched":[{"day":"TUE","time":{"start":"15:00:59","end":"16:00:21"},"allday":false}] },
{"t":"evtA","sched":[{"day":"TUE","time":{"start":"20:00:35","end":"21:30:39"},"allday":false}] },
{"t":"evtB","sched":[{"day":"TUE","time":{"start":"06:00:59","end":"14:00:59"},"allday":false}] },
{"t":"evtD","sched":[{"day":"TUE","time":{"start":"14:00:59","end":"15:00:21"},"allday":false}] },
]
答案 0 :(得分:0)
您绝对应该使用比较器函数进行排序。类似的东西
function sortArray(array) {
myArray.sort( function(x, y) {
if(x.date.toISOString().split('T')[1] === y.date.toISOString().split('T')[1] ) {
return 0;
} else {
return x.date.toISOString().split('T')[1] < y.date.toISOString().split('T')[1] ? 1 : -1
}
});
}
这种情况有点基础,假设您有日期或可以从字符串中创建日期对象。在你的情况下,我会做类似的事情
if(Date.now().toISOString().substring(11, 19) < x.time.start) {
return -1
} else {
// do a normal comparison similar to above, since you know the date your comparing against is past the current time
}
不是一个完整的解决方案,但我希望这个想法存在,祝你好运!