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

JavaScript:如何筛选会话数组并找出最近的下一会话(附示例)

问题描述

需要编写一段JavaScript代码,基于给定的会话数组计算出下一个会话。所有已超过结束日期的会话需被忽略。现有代码已完成部分逻辑,需完善后续逻辑。

现有代码:

const sessions = [{
    "end": "2022-12-28T06:15:00Z",
    "start": "2022-12-23T06:00:00Z" // 这应该是下一个会话,因为它的开始时间比最后一条的2022-12-31更接近当前(当前是12月21日)
  },
  {
    "end": "2022-12-20T06:00:00Z", // 该日期已过期
    "start": "2022-12-18T06:00:00Z"
  },
  {
    "end": "2023-01-26T06:00:00Z",
    "start": "2022-12-31T06:00:00Z"
  }
];

const nextSession = {};

sessions.forEach(session => {
  const sessionStart = new Date(session.start).getTime();
  const sessionEnd = new Date(session.end).getTime();
  const now = new Date().getTime();
  // 计算当前时间与会话开始时间的差值
  const diffStartTime = sessionStart - now;
  console.log('Diff Start: ' + diffStartTime);
  // 计算当前时间与会话结束时间的差值
  const diffEndTime = sessionEnd - now;
  console.log('Diff End: ' + diffEndTime);

  // TODO 如何获取下一个会话?
});
解决方案

可以通过过滤有效会话 + 筛选最接近当前的会话两步实现需求:

完整代码

const sessions = [{
    "end": "2022-12-28T06:15:00Z",
    "start": "2022-12-23T06:00:00Z"
  },
  {
    "end": "2022-12-20T06:00:00Z",
    "start": "2022-12-18T06:00:00Z"
  },
  {
    "end": "2023-01-26T06:00:00Z",
    "start": "2022-12-31T06:00:00Z"
  }
];

const now = Date.now();

// 第一步:过滤掉已结束的会话(结束时间早于当前时间的)
const validSessions = sessions.filter(session => {
  const sessionEnd = new Date(session.end).getTime();
  return sessionEnd >= now;
});

// 第二步:从有效会话中找到最接近当前的下一个会话
let nextSession = null;
if (validSessions.length > 0) {
  nextSession = validSessions.reduce((closestSession, currentSession) => {
    const closestStart = new Date(closestSession.start).getTime();
    const currentStart = new Date(currentSession.start).getTime();
    
    const closestDiff = closestStart - now;
    const currentDiff = currentStart - now;

    // 优先级:正在进行的会话(开始时间<=当前时间)> 即将开始的会话中时间最近的
    if (currentDiff <= 0) {
      return currentSession;
    }
    if (closestDiff <= 0) {
      return closestSession;
    }
    return currentDiff < closestDiff ? currentSession : closestSession;
  });
}

console.log('下一个会话:', nextSession);

逻辑说明

  1. 过滤有效会话:使用filter方法筛选出所有结束时间晚于等于当前时间的会话,直接排除已过期的会话。
  2. 筛选下一个会话:
    • 用reduce遍历有效会话,比较每个会话的开始时间与当前时间的差值。
    • 如果会话已经开始(差值≤0),则优先选择这个正在进行的会话;
    • 如果都是未开始的会话,则选择开始时间与当前时间差值最小的那个,也就是最近会开始的会话。
  3. 边界处理:如果所有会话都已过期,nextSession会保持null,可根据需求添加提示逻辑。

内容的提问来源于stack exchange,提问作者asdasf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:40:43