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
相关产品推荐
相关产品推荐

