如何按结构从嵌套对象中匹配复制对应值到另一对象?
嵌套对象结构保留与值替换实现
我有两个嵌套对象需要处理:obj1是要保留的目标结构,obj2是包含待替换值的数据源。需求很明确:只要obj1中的键在obj2里存在,就用obj2对应的键值覆盖obj1的原值,同时完全保留obj1的结构(obj2里多余的键忽略)。
示例代码
let obj1 = { a: 10, c: { d: 30, e: 50, }, }; let obj2 = { a: 100, x: 200, c: { e: 300, y: 400, }, };
期望结果
result = { a: 100, c: { d: 30, e: 300, } }
手写递归实现
核心逻辑是遍历目标结构obj1的所有键,针对每个键做以下处理:
- 若当前键对应的值是非null对象,则递归处理该子对象;
- 若
obj2中存在相同键,则用obj2的值替换,否则保留obj1原值。
代码实现:
function mergeStructWithValues(targetStruct, sourceValues) { // 处理非对象/Null的情况 if (typeof targetStruct !== 'object' || targetStruct === null) { return sourceValues !== undefined ? sourceValues : targetStruct; } const result = {}; // 仅遍历目标结构的键,确保结构完全保留 for (const key in targetStruct) { if (targetStruct.hasOwnProperty(key)) { result[key] = mergeStructWithValues( targetStruct[key], sourceValues?.[key] // 可选链避免source无对应键时抛出错误 ); } } return result; } // 调用示例 const result = mergeStructWithValues(obj1, obj2); console.log(result);
Lodash 替代实现
如果使用Lodash,可通过_.mergeWith自定义合并规则,确保只保留obj1的结构:
const _ = require('lodash'); const result = _.mergeWith({}, obj1, obj2, (objValue, srcValue) => { // 非对象类型直接替换(如果source有值),对象类型交给默认递归逻辑处理 if (typeof objValue !== 'object' || objValue === null) { return srcValue !== undefined ? srcValue : objValue; } });
内容的提问来源于stack exchange,提问作者Julian-Pascal Ehlers
相关产品推荐
相关产品推荐

