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

求编写可无重叠合并两个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 } }

代码逻辑解释

  1. 避免修改原对象:用扩展运算符{ ...obj1 }复制第一个对象的属性,确保原输入对象不会被改动。
  2. 递归合并子对象:当两个对象的同一键对应的值都是非null对象时,递归调用函数合并它们,这样不管嵌套多少层,都能正确合并属性。
  3. 处理非重叠键:如果第二个对象的键在第一个对象里不存在,直接把这个键值对添加到结果里。

如果你的场景需要处理数组(比如合并数组而不是覆盖),可以在函数里添加数组判断的逻辑,比如:

// 在判断对象的部分添加数组检查
if (Array.isArray(merged[key]) && Array.isArray(obj2[key])) {
  // 这里可以选择合并数组,比如去重或者直接拼接
  merged[key] = [...merged[key], ...obj2[key]];
} else if (isObj1ValObject && isObj2ValObject) {
  // 原有的对象递归合并逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:12:42