JavaScript如何根据指定Date对象在日期数组中查找最近的过去或未来日期
问题分析
- 核心错误:两次
filter操作都仅保留了时间大于等于目标日期findDate的数组元素,早于目标日期的4月1日数据直接被过滤掉了,自然只能得到5月1日的结果 - 逻辑缺陷:计算日期接近度没有对时间差取绝对值,无法正确对比过去日期和未来日期与目标的距离
正确实现
var dateArr = [new Date("Thu Apr 01 2021 00:00:00 GMT+0200"), new Date("Sat May 01 2021 00:00:00 GMT+0200")]; var findDate = new Date("Mon Apr 05 2021 07:50:06 GMT+0200"); function getNearestDateInDateArrByFindDate(dateArr, findDate) { // 边界处理:数组为空直接返回null if (!dateArr.length) return null; let nearestDate = dateArr[0]; let minDiff = Math.abs(nearestDate.getTime() - findDate.getTime()); // 遍历所有日期计算最小时间差 for (const dt of dateArr) { const currentDiff = Math.abs(dt.getTime() - findDate.getTime()); if (currentDiff < minDiff) { minDiff = currentDiff; nearestDate = dt; } } return nearestDate; } var result = getNearestDateInDateArrByFindDate(dateArr, findDate); console.log(result); // 输出:Thu Apr 01 2021 00:00:00 GMT+0200
实现说明
- 直接遍历所有日期元素,不用过滤,覆盖过去和未来的所有候选日期
- 用
Math.abs计算时间差的绝对值,不管日期在目标之前还是之后,统一对比距离大小 - 遍历过程中实时更新最小差值对应的日期,时间复杂度O(n),比先排序效率更高
内容的提问来源于stack exchange,提问作者unstuckMe
相关产品推荐
相关产品推荐

