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);
逻辑说明
- 过滤有效会话:使用
filter方法筛选出所有结束时间晚于等于当前时间的会话,直接排除已过期的会话。 - 筛选下一个会话:
- 用
reduce遍历有效会话,比较每个会话的开始时间与当前时间的差值。 - 如果会话已经开始(差值≤0),则优先选择这个正在进行的会话;
- 如果都是未开始的会话,则选择开始时间与当前时间差值最小的那个,也就是最近会开始的会话。
- 用
- 边界处理:如果所有会话都已过期,
nextSession会保持null,可根据需求添加提示逻辑。
内容的提问来源于stack exchange,提问作者asdasf
相关产品推荐
相关产品推荐

