根据javascript中的当前时间按时间对象对数组进行排序

时间:2021-05-11 02:03:49

标签: javascript ecmascript-6

我在根据当前时间按时间对象对数组进行排序时遇到问题。该代码有时有效,但有时无效。我的代码有什么错误,或者有更好的排序方法吗?

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}] },
]

1 个答案:

答案 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
}

不是一个完整的解决方案,但我希望这个想法存在,祝你好运!