当前位置: 首页 > news >正文

JavaScript 动态访问嵌套对象属性问题记录

问题描述

不能解析 2 层 只能解析一层

在 Vue 项目中,尝试通过动态路径(如 'otherInfo.businessPlacePhotoUrlLabel')访问或修改嵌套对象属性时,发现 this['a.b.c'] 无法正确解析,导致返回 undefined

错误示例

removeImg(valLabel, valueLabel) {console.log(this[valLabel]); // undefined(无法解析 'a.b.c')
}

问题原因

  • 'a.b.c' 这样的字符串路径,它只会查找 this 上的 'a.b.c' 属性(而不是 this.a.b.c)。
  • 例如:
    • this['otherInfo.businessPlacePhotoUrlLabel'] 会查找 this 上是否有 'otherInfo.businessPlacePhotoUrlLabel' 这个键,而不是 this.otherInfo.businessPlacePhotoUrlLabel

解决方案

方法 1:手动解析路径(推荐)

适用于任意深度的嵌套对象:

/*** 获取嵌套对象属性值* @param {Object} obj - 目标对象* @param {string} path - 路径(如 'a.b.c')* @returns {any} - 返回属性值,如果路径无效返回 undefined*/
function getNestedValue(obj, path) {return path.split('.').reduce((o, key) => o && o[key], obj);
}/*** 设置嵌套对象属性值* @param {Object} obj - 目标对象* @param {string} path - 路径(如 'a.b.c')* @param {any} value - 要设置的值*/
function setNestedValue(obj, path, value) {const keys = path.split('.');const lastKey = keys.pop();const parent = keys.reduce((o, key) => o && o[key], obj);if (parent) parent[lastKey] = value;
}// 示例:在 Vue 方法中使用
removeImg(valLabel, valueLabel) {const valLabelValue = getNestedValue(this, valLabel);const valueLabelValue = getNestedValue(this, valueLabel);console.log(valLabelValue, valueLabelValue); // 正确输出setNestedValue(this, valLabel, ''); // 清空setNestedValue(this, valueLabel, ''); // 清空
}

方法 2:直接访问(适用于固定路径)

如果路径结构固定(如 'otherInfo.businessPlacePhotoUrlLabel'),可以手动拆分:

removeImg(valLabel, valueLabel) {const [obj1, key1] = valLabel.split('.');const [obj2, key2] = valueLabel.split('.');console.log(this[obj1][key1]); // 正确访问this[obj1][key1] = ''; // 清空this[obj2][key2] = ''; // 清空
}

注意事项

  1. 确保路径存在:如果路径中间某个对象不存在,getNestedValue 会返回 undefinedsetNestedValue 不会设置值。
  2. 避免路径错误:确保传入的 path 格式正确(如 'a.b.c',不能是 'a..b''a.b.')。
  3. Vue 响应式更新:如果直接修改嵌套对象,Vue 可能不会触发更新,建议使用 Vue.set 或返回新对象。

总结

方法

适用场景

优点

缺点

手动解析路径

任意深度嵌套对象

通用性强

代码稍复杂

直接访问

路径固定且简单

代码简洁

不适用于动态深度路径

getNestedValuesetNestedValue 方法,确保代码健壮性。


文章转载自:
http://aspergillosis.tmizpp.cn
http://ameliorator.tmizpp.cn
http://btm.tmizpp.cn
http://bannerette.tmizpp.cn
http://aceraceous.tmizpp.cn
http://amusia.tmizpp.cn
http://accelerogram.tmizpp.cn
http://armenoid.tmizpp.cn
http://braider.tmizpp.cn
http://baldly.tmizpp.cn
http://cheek.tmizpp.cn
http://bedrench.tmizpp.cn
http://breathed.tmizpp.cn
http://argental.tmizpp.cn
http://bugbear.tmizpp.cn
http://azoth.tmizpp.cn
http://chemistry.tmizpp.cn
http://bellwort.tmizpp.cn
http://accessit.tmizpp.cn
http://bantering.tmizpp.cn
http://centralist.tmizpp.cn
http://cesarevitch.tmizpp.cn
http://accuse.tmizpp.cn
http://axestone.tmizpp.cn
http://apomorphine.tmizpp.cn
http://blunder.tmizpp.cn
http://brazilin.tmizpp.cn
http://avventurina.tmizpp.cn
http://addend.tmizpp.cn
http://camaraderie.tmizpp.cn
http://www.dtcms.com/a/280349.html

相关文章:

  • HarmonyOS-ArkUI: Web组件加载流程1
  • 暴力破解:攻破系统的终极密钥
  • Rust指针选择
  • 安装带GPU的docker环境
  • 20250715使用荣品RD-RK3588开发板在Android13下接入USB3.0接口的红外相机
  • 【I3D 2024】Deblur-GS: 3D Gaussian Splatting from Camera Motion Blurred Images
  • 记录一条面试sql题目
  • JS中async/await功能介绍和使用演示
  • 普通字符类型和new String有什么区别
  • 使用JS编写动态表格
  • 【env环境】rtthread5.1.0使用fal组件
  • AI的外挂知识库,RAG检索增强生成技术
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • 数仓面试题
  • 2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?
  • docker停止所有容器和删除所有镜像
  • 从一道题目(阿里2014 Crackme_2)开启unidbg还原算法入门(转载)
  • 强化学习书籍
  • vscode 打开c++文件注释乱码
  • 分布式存储之Ceph使用指南--部署篇(未完待续)
  • Claude 背后金主亚马逊亲自下场,重磅发布 AI 编程工具 Kiro 现已开启免费试用
  • 【交叉编译报错】fatal: not a git repository (or any of the parent directories): .git
  • 分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?
  • 内存的基础相关知识,什么是内存,内存管理
  • 死锁问题以及读写锁和自旋锁介绍【Linux操作系统】
  • Spring 中 @Component和@Bean注解的区别
  • 为何说分布式 AI 推理已成为下一代计算方式
  • SpringBoot 2.x→3.0升级实战:Jakarta EE兼容性改造清单
  • kotlin布局交互
  • Kotlin聚合方法