实现:查找最接近指定时间的较小值,无符合值则取对象最后一项
实现指定时间的最接近较小值查找逻辑
需求说明
给定一个包含时间字符串的对象,需要实现以下逻辑:
- 查找最接近指定时间且小于等于该时间的项
- 若所有时间都大于指定时间,则返回原对象的最后一项
示例对象:
const times = { sunrise: "5:32", sunset: "6:22", midnight: "12:11" };
- 当指定时间为
6:10时,期望输出{ sunrise: "5:32" } - 当指定时间为
3:16(小于所有时间)时,期望输出{ midnight: "12:11" }
实现思路
- 时间数值化:将"HH:MM"格式的时间字符串转换为分钟数,方便进行数值比较
- 结构化处理:将原对象的键值对转换为包含键、时间字符串、分钟数的数组,同时记录原对象的最后一项
- 筛选与匹配:
- 筛选出所有分钟数小于等于目标时间的项
- 若筛选结果为空,直接返回原对象的最后一项
- 若有筛选结果,从中找出分钟数最大的项(即最接近目标的较小值)
代码实现
// 将时间字符串转换为分钟数的工具函数 function timeToMinutes(timeStr) { const [hours, minutes] = timeStr.split(':').map(Number); return hours * 60 + minutes; } // 核心查找函数 function findClosestEarlierTime(timesObj, targetTime) { const targetMinutes = timeToMinutes(targetTime); // 转换对象为包含完整信息的数组 const timeEntries = Object.entries(timesObj).map(([key, time]) => ({ key, time, minutes: timeToMinutes(time) })); // 记录原对象的最后一项 const lastEntry = timeEntries[timeEntries.length - 1]; // 筛选符合条件的候选项 const validCandidates = timeEntries.filter(entry => entry.minutes <= targetMinutes); if (validCandidates.length === 0) { return { [lastEntry.key]: lastEntry.time }; } else { // 找出候选项中最接近目标的(分钟数最大的) const closestEntry = validCandidates.reduce((prev, curr) => curr.minutes > prev.minutes ? curr : prev ); return { [closestEntry.key]: closestEntry.time }; } }
测试验证
const times = { sunrise: "5:32", sunset: "6:22", midnight: "12:11" }; // 测试场景1:目标时间6:10 console.log(findClosestEarlierTime(times, "6:10")); // 输出:{ sunrise: "5:32" } // 测试场景2:目标时间3:16 console.log(findClosestEarlierTime(times, "3:16")); // 输出:{ midnight: "12:11" }
内容的提问来源于stack exchange,提问作者Nora
相关产品推荐
相关产品推荐

