如何实现数据行转列?按国家聚合月度数据并补全缺失值
按国家分组并转换月份为属性的解决方案
原始数据
var dataarray = [ { "Country": "America", "Total": 200, "Month": "Jan" }, { "Country": "America", "Total": 100, "Month": "Feb" }, { "Country": "India", "Total": 100, "Month": "Feb" } ];
期望输出格式
var final_array = [ {"Country": "America", "Jan": 200, "Feb": 100 }, {"Country": "India", "Jan": 0, "Feb": 100 } ];
现有代码的问题
你当前的实现没有处理缺失月份补0的核心需求,同时合并对象的逻辑会保留原始的Month和Total字段,不符合目标格式,且数组操作的方式效率较低。
完整实现代码
// 第一步:提取所有出现过的唯一月份 const allMonths = [...new Set(dataarray.map(item => item.Month))]; // 第二步:按国家分组,初始化所有月份为0 const countryGroups = {}; dataarray.forEach(item => { const { Country, Month, Total } = item; // 如果该国家还未初始化,先创建基础结构 if (!countryGroups[Country]) { countryGroups[Country] = { Country }; // 给所有月份设置初始值0 allMonths.forEach(month => { countryGroups[Country][month] = 0; }); } // 覆盖对应月份的实际数值 countryGroups[Country][Month] = Total; }); // 第三步:将分组对象转换为数组格式 const final_array = Object.values(countryGroups); // 验证结果 console.log(final_array);
代码逻辑说明
- 提取唯一月份:利用
Set自动去重的特性,从原始数据中获取所有存在的月份,确保每个国家的对象都包含这些月份属性。 - 初始化分组结构:遍历原始数据时,若遇到新国家,先创建包含国家名称和所有月份(初始值0)的对象,避免遗漏月份。
- 填充实际数据:对已有国家的条目,直接覆盖对应月份的数值。
- 转换为目标数组:通过
Object.values将分组后的对象集合转换为数组格式,得到最终结果。
内容的提问来源于stack exchange,提问作者grabrep gg
相关产品推荐
相关产品推荐

