JS动态年份数组生成:现有函数的高效优化方案问询
高效生成动态年份列表的优化方案
需求说明
需要生成包含当前年份、前3年、后4年的动态年份列表,列表开头必须添加一个空对象。预期的年份序列(以2023年为当前年为例)为 [2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027](原示例中的重复当前年是原代码合并后的冗余,最终需去重)。现有代码可运行但存在冗余,需优化实现效率。
现有冗余代码
const generateYears = () => { const previousYears = [...Array(4)].map( (a, b) => new Date().getFullYear() - b, ); const futureYears = [...Array(5)].map((a, b) => new Date().getFullYear() + b); const years = new Set([...previousYears, ...futureYears].sort()); const yearsObj = [...years].map((year: number) => { return { value: year.toString(), name: year.toString(), }; }); yearsObj.unshift({ value: '', name: '', }); return yearsObj; };
优化后的实现方案
优化点
- 避免重复调用
new Date().getFullYear(),仅获取一次当前年份,减少性能开销 - 直接生成连续年份范围,无需合并两个数组再去重,简化逻辑
- 合并数组生成、格式转换、添加空对象的步骤,减少中间变量
优化代码
const generateYears = () => { const currentYear = new Date().getFullYear(); // 生成从「当前年-3」到「当前年+4」的连续年份数组,共8个年份 const yearRange = Array.from({ length: 8 }, (_, index) => currentYear - 3 + index); // 组合空对象与格式化后的年份对象数组 return [ { value: '', name: '' }, ...yearRange.map(year => ({ value: year.toString(), name: year.toString() })) ]; };
代码说明
- 先获取当前年份并存储,避免重复创建Date实例
- 使用
Array.from直接生成目标年份范围:从currentYear - 3到currentYear + 4,长度为8,正好覆盖前3年、当前年、后4年 - 直接通过扩展运算符将空对象与映射后的年份对象数组组合,一步返回结果,逻辑更简洁高效
内容的提问来源于stack exchange,提问作者reactdev1231231
相关产品推荐
相关产品推荐

