如何从API返回的JSON中提取离当前时间最近的未来start_time对应的ID
解决方法
核心逻辑很简单:先过滤掉所有时间早于当前时间的条目,再从剩下的未来时间条目中找和当前时间差值最小的即可。
原生JavaScript实现
你之前的代码问题有两个:
- 没有先过滤过去的条目,过去时间和当前时间的差值为负数,排序时会排在最前面,导致拿到过期数据
- 代码中写的
shift_start_time和实际JSON结构里的start_time字段不匹配,属于拼写错误
修正后的代码:
const currentTs = Date.now(); // 先预处理所有条目,计算和当前时间的差值 const validItems = response.map(item => { const startTimeTs = new Date(item.expected.start_time).getTime(); return { ...item, diff: startTimeTs - currentTs }; // 只保留未来时间的条目,如果需要包含当前时间可把>0改成>=0 }).filter(item => item.diff > 0); let targetId = null; if (validItems.length) { // 找差值最小的条目,也就是离当前时间最近的未来条目 const nearestItem = validItems.reduce((prev, curr) => prev.diff < curr.diff ? prev : curr); targetId = nearestItem.expected.id; } console.log(targetId ?? '无符合要求的未来条目');
Moment.js实现
你之前的Moment写法问题是只打印了差值,没有收集符合要求的条目做对比,而且漏了expected层级取不到start_time,修正后的代码:
const currentTime = moment(); let minDiff = Infinity; let targetId = null; for (let i = 0; i < response.length; i++) { const item = response[i].expected; const startTime = moment(item.start_time); // 直接用Moment自带的isAfter判断是否为未来时间,不易出错 if (startTime.isAfter(currentTime)) { const diff = startTime.diff(currentTime); if (diff < minDiff) { minDiff = diff; targetId = item.id; } } } console.log(targetId ?? '无符合要求的未来条目');
内容的提问来源于stack exchange,提问作者pratteek shaurya
相关产品推荐
相关产品推荐

