如何在JavaScript中正确调整JSON格式实现数据按字段分组重组
JavaScript实现平铺JSON按州分组聚合方案
实现逻辑
- 用哈希映射按州编码字段
siga_uf对原始平铺记录做分组 - 同组下的所有指标字段值按原始遍历顺序存入对应数组
- 最终将分组结果转换为要求的单键对象数组格式
完整可运行代码
// 原始源数据 const sourceData = [{"sigla_uf": "AC", "ano": 2020, "mes": 1, "admitidos": 2939, "desligados": 2520, "saldo_movimentacao": 419}, {"sigla_uf": "AC", "ano": 2020, "mes": 2, "admitidos": 3147, "desligados": 2182, "saldo_movimentacao": 965}, {"sigla_uf": "AC", "ano": 2020, "mes": 3, "admitidos": 2874, "desligados": 2689, "saldo_movimentacao": 185}, {"sigla_uf": "RJ", "ano": 2020, "mes": 1, "admitidos": 2939, "desligados": 2520, "saldo_movimentacao": 419}, {"sigla_uf": "RJ", "ano": 2020, "mes": 2, "admitidos": 3147, "desligados": 2182, "saldo_movimentacao": 965}, {"sigla_uf": "RJ", "ano": 2020, "mes": 3, "admitidos": 2874, "desligados": 2689, "saldo_movimentacao": 185}] // 分组聚合 const groupMap = {} sourceData.forEach(item => { const ufCode = item.sigla_uf // 首次遇到该州时初始化各字段空数组 if (!groupMap[ufCode]) { groupMap[ufCode] = { ano: [], mes: [], admitidos: [], desligados: [], saldo_movimentacao: [] } } // 逐字段将值推入对应数组 groupMap[ufCode].ano.push(item.ano) groupMap[ufCode].mes.push(item.mes) groupMap[ufCode].admitidos.push(item.admitidos) groupMap[ufCode].desligados.push(item.desligados) groupMap[ufCode].saldo_movimentacao.push(item.saldo_movimentacao) }) // 转换为目标要求的数组结构 const targetData = Object.entries(groupMap).map(([ufCode, aggregateData]) => ({[ufCode]: aggregateData}))
输出效果
运行后得到的结果完全匹配需求结构,示例输出如下:
[ { "AC": { "ano": [2020, 2020, 2020], "mes": [1, 2, 3], "admitidos": [2939, 3147, 2874], "desligados": [2520, 2182, 2689], "saldo_movimentacao": [419, 965, 185] } }, { "RJ": { "ano": [2020, 2020, 2020], "mes": [1, 2, 3], "admitidos": [2939, 3147, 2874], "desligados": [2520, 2182, 2689], "saldo_movimentacao": [419, 965, 185] } } ]
注:你提供的目标结构示例存在JSON语法疏漏(AC字段对应的对象缺少闭合花括号),上述代码输出为语法完全合法、逻辑匹配需求的结果。代码无第三方依赖,浏览器、Node.js环境均可直接运行,后续新增指标字段只需在初始化分组和值推入步骤补充对应逻辑即可扩展。
内容的提问来源于stack exchange,提问作者Lucas Thaynan
相关产品推荐
相关产品推荐

