如何生成跨指定时间段、含月份数字与名称的对象数组?
问题:生成覆盖指定年月范围的月份对象数组(含月份名称)
我需要生成一个数组,每个元素对应一个月份对象,覆盖给定的起始年月到结束年月范围。每个对象要同时包含月份名称缩写。比如输入起始日期11/22(2022年11月)、结束日期04/23(2023年4月),期望输出如下结构的数组:
const dataResult = [ {id: 1, month: "11", monthName: "Nov", year: 2022}, {id: 2, month: "12", monthName: "Dec", year: 2022}, {id: 3, month: "01", monthName: "Jan", year: 2023}, {id: 4, month: "02", monthName: "Feb", year: 2023}, {id: 5, month: "03", monthName: "Mar", year: 2023}, {id: 6, month: "04", monthName: "Apr", year: 2023}, ]
我已经准备了一个包含月份ID和名称的参考数组,但不知道如何结合它实现需求:
const monthsWithIds = [ { id: 1, name: "Jan" }, { id: 2, name: "Feb" }, { id: 3, name: "Mar" }, { id: 4, name: "Apr" }, { id: 5, name: "May" }, { id: 6, name: "Jun" }, { id: 7, name: "Jul" }, { id: 8, name: "Aug" }, { id: 9, name: "Sep" }, { id: 10, name: "Oct" }, { id: 11, name: "Nov" }, { id: 12, name: "Dec" } ];
解决方案
你可以通过解析起始/结束日期、逐月遍历并匹配参考数组的方式实现需求,具体代码如下:
// 你的月份参考数组 const monthsWithIds = [ { id: 1, name: "Jan" }, { id: 2, name: "Feb" }, { id: 3, name: "Mar" }, { id: 4, name: "Apr" }, { id: 5, name: "May" }, { id: 6, name: "Jun" }, { id: 7, name: "Jul" }, { id: 8, name: "Aug" }, { id: 9, name: "Sep" }, { id: 10, name: "Oct" }, { id: 11, name: "Nov" }, { id: 12, name: "Dec" } ]; // 生成目标数组的函数,接收"MM/YY"格式的起止日期 function generateMonthArray(startDateStr, endDateStr) { // 解析起始日期为年份和月份 const [startMonth, startYearSuffix] = startDateStr.split('/').map(Number); const startYear = 2000 + startYearSuffix; // 解析结束日期为年份和月份 const [endMonth, endYearSuffix] = endDateStr.split('/').map(Number); const endYear = 2000 + endYearSuffix; const result = []; let currentYear = startYear; let currentMonth = startMonth; let id = 1; // 循环生成每个月份的对象 while (true) { // 从参考数组中匹配当前月份的名称 const monthInfo = monthsWithIds.find(item => item.id === currentMonth); // 推入目标对象,月份补零为两位字符串 result.push({ id: id++, month: currentMonth.toString().padStart(2, '0'), monthName: monthInfo.name, year: currentYear }); // 到达结束日期时终止循环 if (currentYear === endYear && currentMonth === endMonth) { break; } // 月份递增,处理跨年逻辑 currentMonth++; if (currentMonth > 12) { currentMonth = 1; currentYear++; } } return result; } // 调用示例 const dataResult = generateMonthArray('11/22', '04/23'); console.log(dataResult);
关键说明:
- 日期解析:将输入的"MM/YY"格式字符串拆分为月份和年份后缀,转换为四位年份(如
22→2022) - 逐月遍历:使用
while循环逐个生成月份对象,遇到12月时自动切换到下一年的1月 - 月份名称匹配:通过
find方法从你的monthsWithIds数组中找到对应月份的缩写 - 格式统一:用
padStart(2, '0')将单个数字的月份转换为两位字符串(如1→"01"),与示例输出一致
内容的提问来源于stack exchange,提问作者Stykgwar
相关产品推荐
相关产品推荐

