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

如何按结构从嵌套对象中匹配复制对应值到另一对象?

嵌套对象结构保留与值替换实现

我有两个嵌套对象需要处理: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:15:42