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' } } */
关键细节说明
- 递归遍历:内部的
traverse函数会逐层遍历对象的所有属性,不管嵌套多深,都能定位到目标propertyName。 - 对象合并:这里用
Object.assign来合并对象,它会把addObj的属性添加到目标属性对象中,如果有同名键,addObj的会覆盖原有的(如果需要深合并,可以扩展这个逻辑)。 - 边界处理:判断
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
相关产品推荐
相关产品推荐

