如何基于当前日期对含MM-DD格式日期的JS对象数组进行排序
原代码存在的问题
- 直接传入
MM-DD格式字符串给Date构造函数,不同浏览器的解析逻辑存在差异,且默认会自动补全当前年份,容易出现日期解析错误。 - 排序逻辑仅按时间戳大小排序,没有按需求区分「未来日期」和「已过日期」两个分组,排序规则不匹配。
解决方案
首先明确排序规则:
- 未到的未来日期整体排在已过日期前面
- 未来日期按距离当前日期的时间差升序排列(越近越靠前)
- 已过日期按距离当前日期的时间差升序排列(越远越靠前)
完整实现代码
var array = [{id: 1, date:'12-28'}, {id: 2, date:'11-30'}, {id: 3, date:'09-30'}, {id: 4, date:'05-30'}]; // 计算MM-DD格式日期和当前日期的毫秒差 function getDateDiff(monthDay) { const now = new Date(); // 把时分秒清零,仅比较日期,避免时间影响 now.setHours(0, 0, 0, 0); const currentYear = now.getFullYear(); // 拼接为标准YYYY-MM-DD格式,避免解析错误 const targetDate = new Date(`${currentYear}-${monthDay}`); targetDate.setHours(0, 0, 0, 0); return targetDate.getTime() - now.getTime(); } array.sort(function(a, b) { const diffA = getDateDiff(a.date); const diffB = getDateDiff(b.date); // 两个都是未来日期,按差值升序,越近越靠前 if (diffA >= 0 && diffB >= 0) { return diffA - diffB; } // 两个都是已过日期,按差值升序,越远越靠前 if (diffA < 0 && diffB < 0) { return diffA - diffB; } // 一个未来一个已过,未来的排在前面 return diffA >= 0 ? -1 : 1; }); console.log(array);
如果需要处理跨年场景(比如当前日期为12月30日,01-05是下一年的最近日期),可以修改getDateDiff函数,自动判断是否需要使用下一年的日期计算差值:
function getDateDiff(monthDay) { const now = new Date(); now.setHours(0, 0, 0, 0); const currentYear = now.getFullYear(); let targetDate = new Date(`${currentYear}-${monthDay}`); targetDate.setHours(0, 0, 0, 0); let diff = targetDate.getTime() - now.getTime(); // 如果今年的日期已过,计算下一年同日期的差值 if (diff < 0) { const nextYearDate = new Date(`${currentYear + 1}-${monthDay}`); nextYearDate.setHours(0, 0, 0, 0); diff = nextYearDate.getTime() - now.getTime(); } return diff; }
内容的提问来源于stack exchange,提问作者Creatz
相关产品推荐
相关产品推荐

