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

JavaScript合并JSON对象实现Google堆叠柱状图数据整合

合并多源JSON数组适配Google堆叠柱状图

问题说明

要做Google堆叠柱状图展示2022、2023年数据,但数据分别来自MS SQL和MySQL,没法在上游合并,拿到两个JSON数组:

[["","Others","Restaurant","Retail"],["2022",3362,810,2110],["2023",0,0,0]]
[["","Event","Hotel","Other","Restaurant"],["2022",0,0,0,0],["2023",3802.5,2642,10955.44,7256]]

试过$.merge()和map()都达不到期望的合并格式——需要把所有类别整合,对应年份缺失的数据补0,最终要得到类似这样的结构:

[["","Event","Hotel","Restaurant","Retail","Others","Other"],["2022",0,0,810,2110,3362,0],["2023",3802.5,2642,7256,0,0,10955.44]]

解决方案:自定义逻辑实现

这种带表头的二维数组合并,需要对齐类别、补全缺失值,没有现成的通用工具函数,得自己写逻辑处理,下面是具体实现:

实现思路

  • 把两个原始数组转换成「年份-类别-数值」的映射结构,方便快速取值
  • 合并所有类别并去重,收集所有涉及的年份
  • 遍历每个年份,针对每个合并后的类别,从映射中取对应值,没有的补0
  • 组装成Google图表需要的二维数组格式

具体代码(JavaScript)

// 原始数据源
const json1 = [["","Others","Restaurant","Retail"],["2022",3362,810,2110],["2023",0,0,0]];
const json2 = [["","Event","Hotel","Other","Restaurant"],["2022",0,0,0,0],["2023",3802.5,2642,10955.44,7256]];

// 合并多源图表数据的函数
function mergeChartDatasets(...datasets) {
    // 将单份数据集转换为类别列表和年份-类别映射
    const parseDataset = (dataset) => {
        const [header, ...yearRows] = dataset;
        const categories = header.slice(1);
        const yearMap = {};
        yearRows.forEach(row => {
            const [year, ...values] = row;
            yearMap[year] = {};
            categories.forEach((cat, index) => {
                yearMap[year][cat] = values[index];
            });
        });
        return { categories, yearMap };
    };

    // 解析所有输入数据集
    const parsedDatasets = datasets.map(parseDataset);
    
    // 合并所有类别(去重),可按需调整排序逻辑
    const allCategories = [...new Set(parsedDatasets.flatMap(d => d.categories))];
    // 合并所有年份(去重)
    const allYears = [...new Set(parsedDatasets.flatMap(d => Object.keys(d.yearMap)))];

    // 构建最终结果数组
    const result = [["", ...allCategories]];
    allYears.forEach(year => {
        const row = [year];
        allCategories.forEach(cat => {
            // 从所有数据集中找对应年份的类别值,找不到补0
            let value = 0;
            for (const ds of parsedDatasets) {
                if (ds.yearMap[year] && ds.yearMap[year][cat] !== undefined) {
                    value = ds.yearMap[year][cat];
                    break; // 若多个数据集有同一类别,取第一个出现的值,按需调整
                }
            }
            row.push(value);
        });
        result.push(row);
    });

    return result;
}

// 执行合并并输出结果
const mergedResult = mergeChartDatasets(json1, json2);
console.log(JSON.stringify(mergedResult));

关键说明

  • 函数支持传入多个数据集(不止两个),后续新增数据源直接加参数即可
  • 注意数据里的「Others」和「Other」是两个不同类别,如果是拼写错误,要先统一名称(比如把Other替换为Others),避免重复
  • 可以根据需求调整类别和年份的排序逻辑,比如改成按字母排序或者原数据出现顺序排序

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:55:40