如何使用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
相关产品推荐
相关产品推荐

