You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现数据行转列?按国家聚合月度数据并补全缺失值

按国家分组并转换月份为属性的解决方案

原始数据

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);

代码逻辑说明

  1. 提取唯一月份:利用Set自动去重的特性,从原始数据中获取所有存在的月份,确保每个国家的对象都包含这些月份属性。
  2. 初始化分组结构:遍历原始数据时,若遇到新国家,先创建包含国家名称和所有月份(初始值0)的对象,避免遗漏月份。
  3. 填充实际数据:对已有国家的条目,直接覆盖对应月份的数值。
  4. 转换为目标数组:通过Object.values将分组后的对象集合转换为数组格式,得到最终结果。

内容的提问来源于stack exchange,提问作者grabrep gg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:01:09