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

JavaScript如何通过路径指针动态修改多层嵌套对象属性值

嵌套对象按路径动态修改属性方案

检索关键词

你要找这类场景的参考资料,可以搜以下关键词:

  • JS 深度设置嵌套对象属性
  • 对象属性路径解析
  • deep set nested property
  • nested object path access

通用实现方案

核心逻辑非常统一:把路径字符串按分隔符拆成属性名数组,逐层向下遍历对象直到目标属性的上一层,最后完成赋值,支持任意深度的嵌套,也可以按需配置中间路径不存在时是否自动创建空对象。

原生JS实现(无依赖)

function setByPath(obj, path, value, autoCreateNested = true) {
  const keys = path.split('/').filter(Boolean);
  if (keys.length === 0) return obj;

  let cursor = obj;
  // 遍历到倒数第二层节点
  for (let i = 0; i < keys.length - 1; i++) {
    const key = keys[i];
    if (cursor[key] == null) {
      if (!autoCreateNested) throw new Error(`路径 ${path} 不存在`);
      cursor[key] = {};
    }
    cursor = cursor[key];
  }
  // 赋值最终属性
  cursor[keys.at(-1)] = value;
  return obj;
}

// 调用示例
const enemyData = {
  "id_": "1",
  "name": "Enemy x",
  "image": "image.png",
  "stats": {
    "level": 1,
    "attack": 5,
    "defense": 0
  }
};
// 修改第二层属性
setByPath(enemyData, 'stats/attack', 20);
console.log(enemyData.stats.attack) // 20

// 修改第四层属性,自动创建中间缺失的节点
setByPath(enemyData, 'stats/buff/attack/delta', 5);
console.log(enemyData.stats.buff.attack.delta) //5

如果需要读取对应路径的属性,逻辑类似,逐层遍历取值即可,遇到空节点直接返回undefined就行。

工程化场景方案

如果项目里已经引入了Lodash这类通用工具库,不需要自己写实现,直接用内置的_.set方法即可,已经覆盖了所有边界异常处理,稳定性更高:

import _ from 'lodash';
// 路径转成数组即可适配/分隔的格式
const editPath = 'stats/defense';
_.set(enemyData, editPath.split('/'), 10);

注意:绝对不要用eval实现路径访问,只要路径内容可能来自外部输入,就会存在严重的代码注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:54:16