求编写可无重叠合并两个JSON的函数magicFunctionINeed
实现深度合并两个JSON对象的函数
看起来你要的是一个深度合并函数——也就是当两个对象有相同的顶层键时,不会直接覆盖,而是递归合并它们的子对象;没有重叠的键则原样保留。你的示例里a对象的属性被合并,b和c各自保留,完全符合这个场景。
我来给你写一个可行的实现,还会解释每一步的逻辑:
function magicFunctionINeed(obj1, obj2) { // 先复制第一个对象的所有属性,避免修改原对象 const merged = { ...obj1 }; // 遍历第二个对象的每一个键 for (const key in obj2) { // 检查当前键对应的两个值是否都是非null的对象 const isObj1ValObject = typeof merged[key] === 'object' && merged[key] !== null; const isObj2ValObject = typeof obj2[key] === 'object' && obj2[key] !== null; if (isObj1ValObject && isObj2ValObject) { // 如果都是对象,就递归调用函数合并子对象 merged[key] = magicFunctionINeed(merged[key], obj2[key]); } else if (!(key in merged)) { // 如果第一个对象里没有这个键,直接添加第二个对象的键值对 merged[key] = obj2[key]; } // 额外说明:如果遇到相同键但不是对象的情况(比如obj1.a=1,obj2.a=2),当前代码会保留obj1的值 // 如果你需要覆盖或者处理这种冲突,可以在这里修改逻辑,比如直接赋值 merged[key] = obj2[key] } return merged; }
现在来测试你给出的示例:
const json1 = { a: {x:1, y:2} , b: {x:1, y:2} }; const json2 = { a: {z:3}, c: {z:3, h:4} }; const result = magicFunctionINeed(json1, json2); console.log(result); // 输出结果和你预期的一致: // { a: { x: 1, y: 2, z: 3 }, b: { x: 1, y: 2 }, c: { z: 3, h: 4 } }
代码逻辑解释
- 避免修改原对象:用扩展运算符
{ ...obj1 }复制第一个对象的属性,确保原输入对象不会被改动。 - 递归合并子对象:当两个对象的同一键对应的值都是非null对象时,递归调用函数合并它们,这样不管嵌套多少层,都能正确合并属性。
- 处理非重叠键:如果第二个对象的键在第一个对象里不存在,直接把这个键值对添加到结果里。
如果你的场景需要处理数组(比如合并数组而不是覆盖),可以在函数里添加数组判断的逻辑,比如:
// 在判断对象的部分添加数组检查 if (Array.isArray(merged[key]) && Array.isArray(obj2[key])) { // 这里可以选择合并数组,比如去重或者直接拼接 merged[key] = [...merged[key], ...obj2[key]]; } else if (isObj1ValObject && isObj2ValObject) { // 原有的对象递归合并逻辑 }
内容的提问来源于stack exchange,提问作者SmoggeR_js
相关产品推荐
相关产品推荐

