JavaScript:如何从日期字符串数组中按顺序提取不重复年份?
问题解答:提取年份并升序排序
嘿,好问题!咱们直接切入正题:
是否需要转换成new Date()格式再排序?
完全没必要!转成Date对象属于绕远路,不仅会增加不必要的性能开销,还可能因为不同环境对日期字符串的解析差异(比如时区、格式兼容问题)踩坑。咱们的需求只是提取年份字符串,直接操作字符串就够了,简单又高效。
最佳实现方式
核心思路是提取年份→去重→排序,用ES6+的语法可以写得非常简洁清晰:
代码示例
const array1 = ['9/2022','7/2020','11/2021','12/2020','2/2020','4/2021','10/2021']; // 链式调用的简洁写法 const result = [...new Set(array1.map(item => item.split('/')[1]))] .sort((a, b) => Number(a) - Number(b)); console.log(result); // 输出: ['2020','2021','2022']
步骤拆解
- 提取年份:用
map遍历数组,对每个元素用split('/')分割成[月份, 年份],取索引为1的部分就是年份字符串 - 去重:把提取到的年份数组传入
Set(Set会自动剔除重复值),再用扩展运算符[...]把Set转回数组 - 排序:用
sort方法,把年份字符串转成数字后做减法,实现升序排序(避免默认字符串排序的潜在问题)
额外建议
- 如果担心原数组的格式不统一(比如有的元素不是
月/年格式),可以加个简单的校验,避免报错:const years = array1.map(item => { const parts = item.split('/'); return parts.length === 2 ? parts[1] : ''; // 格式不对的话返回空串,后续可以过滤掉 }).filter(year => year); // 过滤空串 - 要是需要兼容ES5及以下的旧环境,可以把
Set去重换成filter写法:const uniqueYears = years.filter((year, index) => years.indexOf(year) === index); - 排序时一定要转成数字再比较!虽然4位年份的字符串排序结果和数字排序一致,但如果遇到短年份(比如
'20'和'2020'),默认字符串排序就会出错,转数字排序更通用可靠。
内容的提问来源于stack exchange,提问作者NewProgrammer
相关产品推荐
相关产品推荐

