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

JavaScript:向对象中未知位置的指定属性添加子对象

实现addObjectToProperty函数的解决方案

要解决这个在未知层级的指定属性下添加对象的问题,我们可以通过递归遍历对象的方式定位目标属性,然后将addObj合并到该属性中。下面是具体实现:

完整代码示例

function addObjectToProperty(defObj, propertyName, addObj) {
  // 递归遍历对象的内部函数
  function traverse(currentObj) {
    for (const key in currentObj) {
      if (currentObj.hasOwnProperty(key)) {
        // 找到目标属性,合并addObj
        if (key === propertyName) {
          currentObj[key] = Object.assign({}, currentObj[key], addObj);
        }
        // 如果当前值是对象(且不是null),继续递归深入
        else if (typeof currentObj[key] === 'object' && currentObj[key] !== null) {
          traverse(currentObj[key]);
        }
      }
    }
  }

  // 启动遍历,直接修改原对象(也可以返回新对象,看需求)
  traverse(defObj);
  return defObj;
}

// 测试你的示例数据
const defObj = {
  id: 101,
  email: 'jack@dev.com',
  personalInfo: {
    name: 'Jack',
    addresses: {
      firstAddress : {
        line1: 'westwish st',
        line2: 'washmasher',
        city: 'wallas',
        state: 'WX'
      }
    }
  }
};

const addObj = {
  secondAddress : {
    line1: "aStreet",
    city : "aCity",
    state : "aState"
  }
};

// 调用函数,目标属性是'addresses'
addObjectToProperty(defObj, 'addresses', addObj);

// 查看结果
console.log(defObj.personalInfo.addresses);
/* 输出:
{
  firstAddress: { line1: 'westwish st', line2: 'washmasher', city: 'wallas', state: 'WX' },
  secondAddress: { line1: 'aStreet', city: 'aCity', state: 'aState' }
}
*/

关键细节说明

  1. 递归遍历:内部的traverse函数会逐层遍历对象的所有属性,不管嵌套多深,都能定位到目标propertyName。
  2. 对象合并:这里用Object.assign来合并对象,它会把addObj的属性添加到目标属性对象中,如果有同名键,addObj的会覆盖原有的(如果需要深合并,可以扩展这个逻辑)。
  3. 边界处理:判断currentObj[key] !== null是因为typeof null返回object,避免对null进行无效遍历。

可选扩展

  • 如果只需要修改第一个匹配到的目标属性,可以在找到后添加return终止遍历:
    if (key === propertyName) {
      currentObj[key] = Object.assign({}, currentObj[key], addObj);
      return; // 找到第一个就停止
    }
    
  • 如果需要深合并嵌套对象,可以写一个深合并函数替换Object.assign,比如:
    function deepMerge(target, source) {
      for (const key in source) {
        if (source[key] && typeof source[key] === 'object') {
          target[key] = deepMerge(target[key] || {}, source[key]);
        } else {
          target[key] = source[key];
        }
      }
      return target;
    }
    
    然后在合并时用deepMerge(currentObj[key], addObj)替代Object.assign。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:25