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

JavaScript如何按点分隔路径字符串更新嵌套对象并保留原有属性

问题分析与修复

原代码核心问题

  • 返回值错误:遍历过程中临时变量temp会不断指向子层级节点,最终返回的是遍历结束时的末端节点,而非完整的根对象。
  • 节点移动逻辑缺失:当路径上的key不存在时,仅为当前层级新增了空对象,没有将temp指向新创建的空对象,导致后续路径节点全部被挂载到上一级节点上,出现cityhouse和major同层级的错误。
  • 可选优化问题:仅对根对象做了浅拷贝,深层对象仍与原对象共享引用,如果需要实现完全的不可变更新,需对遍历到的已存在深层节点也做浅拷贝。

修复后代码

function updateObj(object, path) {
    const pathSegments = path.split('.');
    // 缓存根对象作为最终返回值
    const result = {...object};
    let current = result;

    for (let i = 0; i < pathSegments.length; i++) {
        const key = pathSegments[i];
        // 不存在对应key则创建空对象
        if (!current[key]) {
            current[key] = {};
        } 
        // 若需要不可变更新、避免修改原对象深层属性,可放开下方注释
        // else if (i !== pathSegments.length - 1) {
        //     current[key] = {...current[key]};
        // }
        // 无论节点是否存在,都向下移动一层
        current = current[key];
    }

    return result;
}

// 测试用例
const obj = { country: { town: { company: { boss: {} }}}};
const r = updateObj(obj, 'country.town.cityhouse.major');
console.log(JSON.stringify(r, null, 2));

运行效果

执行后输出完全符合预期结构:

{
  "country": {
    "town": {
      "company": {
        "boss": {}
      },
      "cityhouse": {
        "major": {}
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:00:04