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

如何在指定嵌套层级的嵌套对象中添加子对象?

如何动态向嵌套对象的最后一层添加子对象(不用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:25:27