如何生成含完整12个月的数组?缺失月份数据自动补0
解决方案:生成含完整12个月的数组(缺失月份补0+月份名称替换)
核心思路
先建立月份数字与英文名称的映射表,再将原数组转换为以月份数字为键的快速查询对象,最后遍历全年12个月,逐个匹配原数据(无匹配则填0)并替换为英文月份名。
示例原数组与期望结果
原数组示例:
const originalData = [ { categories: 3, data: 150 }, { categories: 7, data: 200 }, { categories: 10, data: 180 } ];
期望生成的完整数组:
[ { categories: "January", data: 0 }, { categories: "February", data: 0 }, { categories: "March", data: 150 }, { categories: "April", data: 0 }, { categories: "May", data: 0 }, { categories: "June", data: 0 }, { categories: "July", data: 200 }, { categories: "August", data: 0 }, { categories: "September", data: 0 }, { categories: "October", data: 180 }, { categories: "November", data: 0 }, { categories: "December", data: 0 } ]
JavaScript 实现代码
// 定义月份数字到英文名称的映射(索引1对应1月,匹配原数据的月份数字) const monthMap = [ null, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; // 将原数组转换为键为月份数字的对象,用于快速查询 const dataLookup = originalData.reduce((acc, item) => { acc[item.categories] = item.data; return acc; }, {}); // 生成完整的12个月数据 const fullYearData = Array.from({ length: 12 }, (_, idx) => { const monthNum = idx + 1; return { categories: monthMap[monthNum], data: dataLookup[monthNum] || 0 }; }); console.log(fullYearData);
Python 实现代码
如果使用Python处理,逻辑一致:
original_data = [ {"categories": 3, "data": 150}, {"categories": 7, "data": 200}, {"categories": 10, "data": 180} ] month_map = [ None, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ] # 构建月份-数据的查询字典 data_lookup = {item["categories"]: item["data"] for item in original_data} # 生成完整数组 full_year_data = [ {"categories": month_map[month_num], "data": data_lookup.get(month_num, 0)} for month_num in range(1, 13) ] print(full_year_data)
逻辑说明
- 月份映射表:通过索引与月份数字一一对应,避免手动判断每个月份的名称。
- 查询对象/字典:将原数组转换为键值对结构,把查找数据的时间复杂度从O(n)降到O(1),提升效率。
- 遍历生成完整数组:通过循环覆盖1-12月,每个月份优先匹配原数据,无匹配则填充0,同时替换为英文名称,确保全年数据无遗漏。
内容的提问来源于stack exchange,提问作者Jaitsujin
相关产品推荐
相关产品推荐

