如何递归遍历嵌套JS对象,补全目标对象缺失的默认配置项
Discord机器人嵌套配置自动补全实现方案
核心规则:合并嵌套配置时完全保留已有用户配置的所有值,仅把默认配置(
baseConfig)里新增的、用户配置里缺失的键/嵌套对象补充进去,不覆盖用户已经设置的自定义值,实现版本迭代的配置向后兼容。
不要直接使用Object.assign或者对象展开运算符{...obj1, ...obj2}做合并,这两种方式都是浅合并,且会直接覆盖同键名的用户自定义值,不符合需求。可以通过递归遍历默认配置的方式实现缺失项补全。
实现代码
/** * 递归补全缺失配置,不覆盖已有自定义值 * @param {Object} target 待补全的已存用户配置 * @param {Object} defaults 最新版本的默认配置 * @returns {Object} 补全后的完整配置 */ function mergeMissingConfigs(target, defaults) { for (const key in defaults) { // 跳过原型链上的继承属性,只处理配置对象自身的键 if (!Object.prototype.hasOwnProperty.call(defaults, key)) continue; const defaultValue = defaults[key]; const targetValue = target[key]; // 如果当前默认值是纯对象(排除数组、null、函数等特殊类型),且目标对应位置也是纯对象,递归处理嵌套配置层 if ( typeof defaultValue === 'object' && defaultValue !== null && !Array.isArray(defaultValue) && typeof targetValue === 'object' && targetValue !== null && !Array.isArray(targetValue) ) { mergeMissingConfigs(targetValue, defaultValue); } // 只有目标对象完全不存在该键时,才补入默认值 else if (!Object.prototype.hasOwnProperty.call(target, key)) { target[key] = defaultValue; } } return target; }
使用示例
用给出的测试场景验证效果:
// 已存储的用户自定义配置 let obj1 = { emojiSettings: { success: ":success:", error: ":error:" }, warnSettings: { muteThreshold: 3, expireHours: 48 } } // 更新后新增了配置项的默认配置 let obj2 = { emojiSettings: { success: ":defaultSuccess:", error: ":defaultError:" }, warnSettings: { muteThreshold: 2, expireHours: 24 }, newConfig: { newOption: 4 } } // 执行配置补全 const finalConfig = mergeMissingConfigs(obj1, obj2); console.log(finalConfig);
运行后输出结果完全符合预期:已有的自定义配置值全部保留,新增的配置项自动补入:
{ emojiSettings: { success: ":success:", error: ":error:" }, warnSettings: { muteThreshold: 3, expireHours: 48 }, newConfig: { newOption: 4 } }
注意事项
- 如果你不想原地修改原始的已存储配置对象,调用时可以传入空对象作为中转,生成全新的配置对象:
const safeConfig = mergeMissingConfigs(mergeMissingConfigs({}, obj1), obj2) - 上述实现默认将数组类型的配置项作为整体值处理,不会递归合并数组内部元素,如果你的配置中有数组需要特殊合并逻辑,可以在类型判断分支中补充对应规则
- 实际Discord机器人业务场景中,只需要遍历所有服务器(guild)对应的存储配置条目,每个条目都和最新的
baseConfig执行一次上述合并逻辑,再写回存储层即可,后续迭代功能新增配置项时,不需要单独编写配置迁移脚本。
内容的提问来源于stack exchange,提问作者user17066118
相关产品推荐
相关产品推荐

