JavaScript合并JSON数据需先解析为对象/数组再合并,避免字符串拼接;按浅合并(展开运算符)或深合并(lodash.merge)处理对象,数组用扩展运算符拼接或Map去重;最后用JSON.stringify序列化,注意过滤不可序列化值。

JavaScript 中合并 JSON 数据,本质是操作解析后的对象或数组,不是拼接字符串。安全的关键在于:先解析、再按类型合并、最后序列化;全程避免直接执行或污染数据;覆盖逻辑要明确且可控。
先解析,别拼字符串
JSON 是字符串格式,不能直接用 + 拼接。比如:
- ❌ 错误:
'{"a":1}' + '{"b":2}'→ 得到'{"a":1}{"b":2}',不是合法 JSON,JSON.parse()会报错 - ✅ 正确:先
JSON.parse(str1)和JSON.parse(str2),得到两个 JS 对象/数组,再合并 - 务必加
try...catch包裹解析过程,防止非法输入崩溃
对象合并:浅覆盖 or 深合并
覆盖重复键时,分两种常见需求:
-
一层覆盖(浅合并):用展开运算符
{...obj1, ...obj2}或Object.assign({}, obj1, obj2)。obj2 的同名属性完全替换 obj1 的 -
嵌套覆盖(深合并):比如
{user: {name: 'A', age: 20}}和{user: {age: 25, city: 'Beijing'}},希望结果是{user: {name: 'A', age: 25, city: 'Beijing'}}。原生不支持,推荐用lodash.merge(),或手写递归函数 - 注意:深合并时,null、undefined、数组不会被递归处理,需提前校验或清理
数组合并:拼接 or 去重
数组合并通常不需要“覆盖”,而是“合并去重”或“保留全部”:
立即学习“Java免费学习笔记(深入)”;
- 简单拼接:
[...arr1, ...arr2]或arr1.concat(arr2) - 按唯一字段去重(如 id):
[...new Map(arr1.concat(arr2).map(item => [item.id, item])).values()] - 避免用
JSON.stringify+Set去重,它对含函数、undefined 或循环引用的对象会失败
合并后还原为 JSON 字符串
所有操作完成后,再调用 JSON.stringify() 输出标准 JSON:
- 基础用法:
JSON.stringify(mergedData) - 美化输出(调试用):
JSON.stringify(mergedData, null, 2) - 注意过滤不可序列化值:undefined、函数、Symbol、Date 对象(需转字符串)、循环引用都会导致报错或丢失。合并前建议用
JSON.parse(JSON.stringify(data))快速深克隆并剔除非法值(仅适用于纯数据)


















