如何根据事件时间属性从现有对象数组拆分三类事件数组?
解决事件数组按时间状态分类的问题
你的代码主要存在三个核心问题:
- 条件判断顺序错误:
eventsUpcoming的判断永远不会执行,因为所有endDateTime > dateString的事件(包括未开始的)都会被第一个else if分到eventsOngoing数组中 - 进行中事件的条件不完整:你只判断了
endDateTime > dateString,但漏掉了startDateTime < 当前时间的核心条件——只有已经开始且还没结束的事件才属于进行中 - 手动拼接时间字符串冗余且易出错:JS内置方法可以直接生成符合格式的UTC时间字符串,无需手动拼接
正确实现方式
直接使用Date对象的时间戳(数值)进行比较,比字符串比较更可靠,逻辑也更清晰:
// 获取当前UTC时间的毫秒级时间戳 const now = new Date().getTime(); const eventsDone = []; const eventsOngoing = []; const eventsUpcoming = []; const data = [ { "name": "Dinner", "numOfAttending": 4, "startDateTime": "2018-04-28T19:00:00", "endDateTime": "2018-04-28T22:00:00" }, { "name": "Studying", "numOfAttending": 1, "startDateTime": "2020-09-01T09:00:00", "endDateTime": "2023-06-10T15:00:00" }, { "name": "Graduating!", "numOfAttending": 25, "startDateTime": "2023-06-11T09:00:00", "endDateTime": "2023-06-11T12:00:00" } ]; data.forEach(event => { const start = new Date(event.startDateTime).getTime(); const end = new Date(event.endDateTime).getTime(); if (end < now) { // 已结束:结束时间早于当前时间 eventsDone.push(event); } else if (start > now) { // 未开始:开始时间晚于当前时间 eventsUpcoming.push(event); } else { // 进行中:结束时间晚于当前,且开始时间早于当前 eventsOngoing.push(event); } }); console.log('已结束事件:', eventsDone); console.log('进行中事件:', eventsOngoing); console.log('未开始事件:', eventsUpcoming);
代码说明
- 时间戳比较:
new Date(dateString).getTime()会把ISO格式的时间字符串转成毫秒级时间戳,直接比较数值完全避免了字符串比较的潜在格式问题 - 条件顺序优化:先判断已结束,再判断未开始,最后剩下的自然是进行中事件,逻辑严谨且无遗漏
- forEach遍历:比传统for循环更简洁易读,符合现代JavaScript写法
如果坚持要用字符串比较(ISO 8601格式的字符串可直接按字典序比较),也可以调整条件顺序和逻辑后实现:
// 直接生成符合格式的UTC时间字符串,替代手动拼接 const dateString = new Date().toISOString().slice(0, 19); const eventsDone = []; const eventsOngoing = []; const eventsUpcoming = []; data.forEach(event => { if (event.endDateTime < dateString) { eventsDone.push(event); } else if (event.startDateTime > dateString) { eventsUpcoming.push(event); } else if (event.startDateTime < dateString && event.endDateTime > dateString) { eventsOngoing.push(event); } });
内容的提问来源于stack exchange,提问作者user16910522
相关产品推荐
相关产品推荐

