如何用Lodash有条件合并两个配置对象?
用Lodash实现严格匹配默认结构的对象合并
直接上可用的代码实现:
const _ = require('lodash'); const defaultSetting = { level1: { setting1: "defaultValue1", nested: true, home: "africa" }, level2: { setting2: "defaultValue3" } }; const initialSetting = { level1: { setting1: "initialValue1", nested: false }, level2: { nested: true } }; // 核心合并逻辑 const mergedConfig = _.mergeWith({}, defaultSetting, initialSetting, (targetVal, sourceVal) => { // 仅当两者都是纯对象时,过滤掉源对象中目标对象没有的键 if (_.isPlainObject(targetVal) && _.isPlainObject(sourceVal)) { return _.merge({}, targetVal, _.pick(sourceVal, Object.keys(targetVal))); } }); console.log(mergedConfig);
逻辑说明
- 借助
_.mergeWith自定义合并规则,确保最终结构完全遵循defaultSetting的框架 - 对每个层级的对象,通过
_.pick(sourceVal, Object.keys(targetVal))筛选出initialSetting中与defaultSetting重合的属性,再合并到默认配置上 - 非对象类型的属性直接用
initialSetting的值覆盖defaultSetting defaultSetting中未被initialSetting覆盖的属性会完整保留默认值initialSetting中存在但defaultSetting没有的属性会被自动丢弃
运行后输出的结果完全符合你的期望:
{ "level1": { "setting1": "initialValue1", "nested": false, "home": "africa" }, "level2": { "setting2": "defaultValue3" } }
内容的提问来源于stack exchange,提问作者Pravin Poudel
相关产品推荐
相关产品推荐

