基于已有数组生成12个月份的对象数组,缺失月份值设为0
生成包含全年12个月的数组,匹配已有数据并补全默认项
需求说明
创建一个包含12个对象的数组,每个对象对应YYYY-XX格式的月份:
- 若月份存在于给定数组
arr1中,直接加入该数组的对应对象 - 若月份不存在,添加默认对象(格式:
{date: "YYYY-XX", value: 0})
示例数据
待匹配数组:
const arr1 = [ { date: "2024-02", value: "100" }, { date: "2024-08", person: "200" }, ];
当前代码问题
原实现存在多处逻辑错误:
- 循环嵌套
map会重复遍历数组,效率低下且逻辑混乱 - 错误访问
arr1.date,应使用遍历项item.date slice(0,5)截取的是2024-,与数字i永远无法匹配,正确操作应为截取月份部分(如slice(-2))并转为数字- 未处理月份不存在的场景,没有添加默认对象
正确实现代码
const getMonthlyAmount = (arr1) => { // 将arr1转为以日期为键的映射表,提升查找效率 const dateMap = arr1.reduce((map, item) => { map[item.date] = item; return map; }, {}); const result = []; const year = "2024"; // 可根据需求改为动态年份 for (let i = 1; i <= 12; i++) { // 将月份转为两位格式(如1→"01") const month = i.toString().padStart(2, "0"); const currentDate = `${year}-${month}`; // 匹配已有数据或生成默认对象 const matchedItem = dateMap[currentDate] || { date: currentDate, value: 0 }; result.push(matchedItem); } return result; }; // 调用示例 const arr = getMonthlyAmount(arr1); console.log(arr);
代码说明
- 构建日期映射表:通过
reduce把arr1转为{ "YYYY-XX": 对应对象 }的结构,实现O(1)时间复杂度的查找,避免重复遍历数组 - 统一月份格式:用
padStart(2, "0")将1-9月转为两位数字,保证日期格式与arr1一致 - 匹配与补全:对每个月份先查找映射表,存在则复用原对象,不存在则创建默认的
value:0对象,确保结果数组恰好包含12个月份项
内容的提问来源于stack exchange,提问作者Monmon
相关产品推荐
相关产品推荐

