You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据事件时间属性从现有对象数组拆分三类事件数组?

解决事件数组按时间状态分类的问题

你的代码主要存在三个核心问题:

  • 条件判断顺序错误: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);

代码说明

  1. 时间戳比较:new Date(dateString).getTime()会把ISO格式的时间字符串转成毫秒级时间戳,直接比较数值完全避免了字符串比较的潜在格式问题
  2. 条件顺序优化:先判断已结束,再判断未开始,最后剩下的自然是进行中事件,逻辑严谨且无遗漏
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:10:31