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

如何用JavaScript从另一JSON对象更新目标JSON对象(保留原有内容)

深度合并JSON对象,保留原有结构并更新指定键值对

编辑说明:已更新JSON配置,在与"appArr"同级的位置添加了额外的键值对

我希望用另一个JSON对象的子集更新目标JSON对象中的匹配键,同时保留目标对象的所有子键。

全局JSON配置

var config_global = {
  "sub-heading": "This is the sub-heading",
  "content": {
    "par1": "asdf",
    "par2": "qwerty",
    "par3": "12345"
  },
  "appArr": {
    "app1": {
      "id": "ID_001",
      "name": "Application 1",
      "url": "https://app1.html",
      "is_visible": true,
      "in_list": true
    },
    "app2": {
      "id": "ID_002",
      "name": "Application 2",
      "url": "https://app2.html",
      "is_visible": true,
      "in_list": true
    },
    "app3": {
      "id": "ID_003",
      "name": "Application 3",
      "url": "https://app3.html",
      "is_visible": true,
      "in_list": true
    }
  }
}

用于更新的局部JSON配置

var config_local = {
  "content": {
    "par1": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure aperiam inventore nemo, asperiores dolorem nisi voluptate omnis quam sit doloremque expedita architecto dicta, at consequatur."
  },
  "appArr": {
    "app1": {
      "is_visible": false,
      "in_list": true
    },
    "app2": {
      "is_visible": false,
      "in_list": false
    },
    "app3": {
      "is_visible": true,
      "in_list": false
    }
  }
}

最终配置需要保留config_global的完整结构,仅应用config_local中的更新内容。尝试过Object.assign()方法,但它会直接替换整个子对象,而非更新其中的单个键值对。

解决方案:递归深度合并函数

写一个递归函数实现深度合并,遍历每个键,遇到嵌套对象时继续递归合并,而非直接替换:

function deepMerge(target, source) {
  for (const key in source) {
    if (source[key] instanceof Object && target[key] instanceof Object) {
      deepMerge(target[key], source[key]);
    } else {
      target[key] = source[key];
    }
  }
  return target;
}

// 使用时先深拷贝全局配置,避免修改原对象
var config = deepMerge(JSON.parse(JSON.stringify(config_global)), config_local);

期望的最终配置

var config = {
  "sub-heading": "This is the sub-heading",
  "content": {
    "par1": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Iure aperiam inventore nemo, asperiores dolorem nisi voluptate omnis quam sit doloremque expedita architecto dicta, at consequatur.",
    "par2": "qwerty",
    "par3": "12345"
  },
  "appArr": {
    "app1": {
      "id": "ID_001",
      "name": "Application 1",
      "url": "https://app1.html",
      "is_visible": false,
      "in_list": true
    },
    "app2": {
      "id": "ID_002",
      "name": "Application 2",
      "url": "https://app2.html",
      "is_visible": false,
      "in_list": false
    },
    "app3": {
      "id": "ID_003",
      "name": "Application 3",
      "url": "https://app3.html",
      "is_visible": true,
      "in_list": false
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:09:28