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

实现:查找最接近指定时间的较小值,无符合值则取对象最后一项

实现指定时间的最接近较小值查找逻辑

需求说明

给定一个包含时间字符串的对象,需要实现以下逻辑:

  • 查找最接近指定时间且小于等于该时间的项
  • 若所有时间都大于指定时间,则返回原对象的最后一项

示例对象:

const times = {
  sunrise: "5:32",
  sunset: "6:22",
  midnight: "12:11"
};
  • 当指定时间为6:10时,期望输出{ sunrise: "5:32" }
  • 当指定时间为3:16(小于所有时间)时,期望输出{ midnight: "12:11" }

实现思路

  1. 时间数值化:将"HH:MM"格式的时间字符串转换为分钟数,方便进行数值比较
  2. 结构化处理:将原对象的键值对转换为包含键、时间字符串、分钟数的数组,同时记录原对象的最后一项
  3. 筛选与匹配:
    • 筛选出所有分钟数小于等于目标时间的项
    • 若筛选结果为空,直接返回原对象的最后一项
    • 若有筛选结果,从中找出分钟数最大的项(即最接近目标的较小值)

代码实现

// 将时间字符串转换为分钟数的工具函数
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:53:28