如何使用JS/jQ在DateTime数组中查找与指定DateTime最接近的日期
问题梳理
1. 数组说明
存储多个Date对象的数组,示例内容如下:[01.April.2021 00:03:49, 01.May.2021 00:01:21, ...]
2. 功能需求
查找和给定目标日期最接近的日期,具体场景如下:
- 场景1:给定待匹配日期
17.April.2021 00:08:12,期望返回01.May.2021 00:01:21 - 场景2:给定待匹配日期
08.March.2021 00:07:13,期望返回01.April.2021 00:03:49
已尝试方案存在的问题
现有错误代码
//dates are sorted as Date Objects (NOT strings) function getClosestDateInDateArrByFindDate(dateArr, findDate) { //returns sorted array of dates var resultdates = dateArr.sort(function (a, b) { var distancea = Math.abs(findDate - a); var distanceb = Math.abs(findDate - b); //1st return try return new Date(distancea - distanceb); //2nd return try if (distancea > distanceb) { return a; else { return b; }); } return resultDates; //or resultDates[0] cause resultDates[0] features the smallest distance to findDate
解决方案
错误点说明
Array.sort()的比较函数要求返回小于0、等于0、大于0的数字,以此决定两个元素的排序顺序。你之前的代码要么返回Date对象,要么直接返回日期实例,完全不符合sort的规则,排序逻辑完全错误。- sort方法会直接修改原数组,如果不需要修改原数组的话,建议先拷贝数组再操作。
通用正确实现(时间复杂度O(n),性能优于排序方案)
function getClosestDate(dateArr, findDate) { // 处理空输入边界 if (!dateArr || dateArr.length === 0) return null; let closestDate = dateArr[0]; let minDiff = Math.abs(findDate - closestDate); // 遍历一次数组即可得到差值最小的日期 for (let i = 1; i < dateArr.length; i++) { const currentDiff = Math.abs(findDate - dateArr[i]); if (currentDiff < minDiff) { minDiff = currentDiff; closestDate = dateArr[i]; } } return closestDate; }
特殊需求适配:仅查找目标日期之后最近的日期
如果你的实际需求是忽略目标日期之前的日期,只返回目标日期之后的第一个最近日期,可以用下面的实现:
function getClosestDateAfter(dateArr, findDate) { if (!dateArr || dateArr.length === 0) return null; // 过滤出所有大于等于目标日期的元素 const validDates = dateArr.filter(date => date >= findDate); if (validDates.length === 0) return null; // 升序排序后取第一个元素就是最近的后续日期 return validDates.sort((a, b) => a - b)[0]; }
内容的提问来源于stack exchange,提问作者unstuckMe
相关产品推荐
相关产品推荐

