如何在TypeScript中忽略年份仅按月日对日期数组排序
TypeScript 实现仅按月份、日期排序的功能
实现思路
因为输入的日期字符串只包含日、月份三字母缩写(比如示例里的01-jun),不需要考虑年份维度,最稳妥的方案是把每个日期字符串转换成和自然时间顺序正相关的数值权重,直接比较数值大小完成排序,避免原生Date对象带来的时区、默认年份、闰年兼容问题。
核心步骤:
- 先建立月份三字母缩写到1-12数字的映射表,匹配时统一转小写,兼容大小写不一致的输入
- 编写权重计算函数:拆分输入字符串的日、月部分,按照
月份值 * 100 + 日期值的规则计算权重,这个数值的大小和月日的先后顺序完全一致 - 调用数组
sort方法,传入比较函数,按权重升序排列即可
完整实现代码
// 月份缩写与数字的映射表 const monthMap: Record<string, number> = { jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 }; /** * 计算dd-mmm格式日期字符串的排序权重 * @param dateStr 仅含日、月的日期字符串,例:01-jun、2-may */ const getDateWeight = (dateStr: string): number => { const [dayPart, monthPart] = dateStr.split('-'); const monthNum = monthMap[monthPart.toLowerCase().trim()]; const dayNum = parseInt(dayPart.trim(), 10); return monthNum * 100 + dayNum; }; // 示例输入 const dateArr: string[] = ["01-jun","2-may","23-apr","10-dec"]; // 排序时先浅拷贝避免修改原数组 const sortedDateArr = [...dateArr].sort((a, b) => getDateWeight(a) - getDateWeight(b)); console.log(sortedDateArr); // 输出:[ '23-apr', '2-may', '01-jun', '10-dec' ],和自然时间顺序一致
方案说明
不直接使用
new Date()构造日期对象做比较的原因:构造无年份的日期时,JS会默认填充当前系统年份,遇到2月29日这类特殊日期时,非闰年下会自动跳到3月1日,导致排序结果错误;同时Date对象的比较还会受运行环境时区影响,稳定性不如直接数值比较。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

