如何在指定嵌套层级的嵌套对象中添加子对象?
如何动态向嵌套对象的最后一层添加子对象(不用eval,含Object.assign实现)
你提到的需求很常见——动态找到嵌套对象的最后一个目标节点并添加子对象,不用eval的话确实有不少原生JS的实现方式,当然也可以用Object.assign来完成,下面我给你详细拆解几种方案:
一、原生循环实现(最直观,无依赖)
这种方式和你用lodash的思路类似,但完全用原生JS实现,不需要依赖第三方库:
function addNestedTarget(obj, key = 'b', newObj = { c: "new object" }) { let current = obj; // 循环找到最后一个存在目标key的节点 while (current[key] && typeof current[key] === 'object' && current[key] !== null) { current = current[key]; } // 给最后一个节点添加子对象 current[key] = newObj; } // 测试不同场景: // 场景1:初始空对象(层级0) const a1 = {}; addNestedTarget(a1); console.log(a1); // 输出:{ b: { c: "new object" } } // 场景2:已有2层嵌套的对象 const a2 = { b: { c: "new object", b: { c: "new object", } } }; addNestedTarget(a2); console.log(a2.b.b.b); // 输出:{ c: "new object" }
这个方案的优点是逻辑清晰、性能稳定,不管嵌套层级多少都能处理,还通过参数化key和newObj让代码更通用。
二、用Object.assign实现(安全合并属性)
如果你想用Object.assign,可以在最后一步用它来合并属性,这样如果目标节点原本有其他属性,不会被覆盖,只会新增你需要的子对象:
function addNestedWithAssign(obj, key = 'b', newObj = { c: "new object" }) { let current = obj; while (current[key] && typeof current[key] === 'object' && current[key] !== null) { current = current[key]; } // 用Object.assign合并属性,避免覆盖原节点的其他属性 Object.assign(current, { [key]: newObj }); } // 测试:原节点有其他属性的情况 const a3 = { b: { c: "existing value", d: "other prop" } }; addNestedWithAssign(a3); console.log(a3.b); // 输出:{ c: "existing value", d: "other prop", b: { c: "new object" } }
这里用了计算属性名[key],让函数更通用,不管你要添加的键是b还是其他都能适配。
三、递归实现(代码更简洁)
如果你喜欢递归的写法,也可以用递归遍历到最后一层节点:
function addNestedRecursive(obj, key = 'b', newObj = { c: "new object" }) { // 如果当前节点存在目标key且是对象,就递归处理子节点 if (obj[key] && typeof obj[key] === 'object' && obj[key] !== null) { addNestedRecursive(obj[key], key, newObj); } else { // 否则添加子对象 obj[key] = newObj; } } // 测试 const a4 = { b: { b: { c: "test" } } }; addNestedRecursive(a4); console.log(a4.b.b.b); // 输出:{ c: "new object" }
不过要注意,如果嵌套层级极深(比如超过JS调用栈的限制,大概几万层),递归会导致栈溢出,这种情况还是循环更稳妥。
和你当前lodash实现的对比
你现在用lodash.set的方式是可行的,但原生JS方案不需要引入第三方库,更轻量化;如果项目已经依赖lodash,那你的写法也没问题,只是原生方案在性能和打包体积上更有优势。
内容的提问来源于stack exchange,提问作者nibaji
相关产品推荐
相关产品推荐

