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

如何使用JavaScript合并JSON对象?缺失键值时填充null

JavaScript 合并多组JSON对象数组,缺失键用null填充

这里有个实用的解决方案,完美匹配你的需求——把多组按日期分类的JSON数组合并,每个日期对应的对象自动包含所有出现过的字段,缺失的字段值用null填充:

// 你的输入多组数据
const datasets = [
  [ {"dateData": "2019-04-08", "geriatricDepressionScaleTotalScoreData": "5"}, {"dateData": "2019-04-09", "geriatricDepressionScaleTotalScoreData": "2"} ],
  [ {"dateData": "2019-04-08", "digitSpanTotalScoreData": "10"}, {"dateData": "2019-04-09", "digitSpanTotalScoreData": "12"} ],
  [ {"dateData": "2019-04-09", "immediateRecallStoryAData": "4", "delayedRecallStoryAData": "6"} ],
  [ {"dateData": "2019-04-08", "phonologicalTotalData": "30"}, {"dateData": "2019-04-09", "phonologicalTotalData": "4"} ]
];

// 第一步:收集所有需要的字段(排除dateData)
const allFields = new Set();
datasets.flat().forEach(item => {
  Object.keys(item).forEach(key => {
    if (key !== 'dateData') allFields.add(key);
  });
});
const fieldsArray = [...allFields];

// 第二步:按dateData分组合并,初始化缺失字段为null
const mergedMap = new Map();

datasets.forEach(dataArray => {
  dataArray.forEach(item => {
    const date = item.dateData;
    // 如果该日期还没在map里,创建初始对象(所有字段设为null)
    if (!mergedMap.has(date)) {
      const initialObj = { dateData: date };
      fieldsArray.forEach(field => initialObj[field] = null);
      mergedMap.set(date, initialObj);
    }
    // 把当前对象的字段值覆盖到对应日期的对象中
    const existingObj = mergedMap.get(date);
    Object.keys(item).forEach(key => {
      if (key !== 'dateData') {
        // 可选:如果需要把字符串转成数字,用下面这行替换上面的赋值
        // existingObj[key] = Number(item[key]) || null;
        existingObj[key] = item[key];
      }
    });
  });
});

// 转换为最终数组
const result = Array.from(mergedMap.values());

console.log(result);

代码说明:

  • 收集所有字段:通过Set自动去重,确保我们知道最终每个对象需要包含哪些字段,避免遗漏任何键。
  • 按日期分组:用Map存储每个日期对应的对象,初始化时就把所有字段设为null,这样后续只需要覆盖有值的字段即可,不用再事后补全缺失键。
  • 字段值覆盖:遍历所有输入数组,把每个对象的字段值更新到对应日期的对象中,确保已有值的字段不会被null覆盖。

额外优化:

如果你的目标数据需要把字符串类型的数值转成数字(比如示例中immediateRecallStoryAData的4是数字而非字符串),可以把赋值那一行改成:

existingObj[key] = item[key] ? Number(item[key]) : null;

这样就能自动完成类型转换,完全匹配你给出的目标数据格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:51:44