如何通过字符串格式路径获取对象的嵌套属性值
通过字符串路径获取对象嵌套属性的实现方案
你之前写的'primary_role'.name逻辑错误:这行代码是在字符串字面量"primary_role"上读取name属性,和你定义的目标对象完全没有关联,自然无法拿到预期结果。
你贴的示例数据末尾多了一个多余的],实际使用时删除即可,修正后的测试数据如下:
const userData = { "id": "3eef1", "name": "Admin", "email": "email@example.com", "primary_role": { "id": "a37ad", "name": "Shani", "description": " Users", "created_at": 1652413392, "updated_at": 1652413392 }, "created_at": 1652413392, "updated_at": 1652413392, "roles": [], "profile": null, "companies": [] }
无循环/无遍历的实现方式
按照要求不使用循环、不使用reduce/forEach/map这类遍历函数的前提下,可以通过动态函数构造的方式实现任意深度的字符串路径取值:
function getByPath(obj, pathStr) { // 直接拼接属性访问逻辑,全程无循环、无遍历操作 return new Function('obj', `return obj?.${pathStr}`)(obj) }
调用示例
// 获取primary_role下的name属性 console.log(getByPath(userData, 'primary_role.name')) // 输出: Shani // 获取primary_role下的id属性 console.log(getByPath(userData, 'primary_role.id')) // 输出: a37ad // 获取第一层属性 console.log(getByPath(userData, 'email')) // 输出: email@example.com // 读取不存在的属性不会抛出异常,返回undefined console.log(getByPath(userData, 'profile.avatar.url')) // 输出: undefined
注意:该方案适用于常规业务场景,属性名以下划线、驼峰格式命名的场景都可直接使用。如果属性名本身包含
.这类特殊字符,需要提前对路径做转义处理。
单层属性的简单写法
如果你只需要读取第一层属性,不需要嵌套访问,直接用JS原生的方括号动态属性语法即可,不需要额外封装函数:
// 读取第一层的primary_role属性 const primaryRole = userData['primary_role'] // 嵌套读取也可以直接串联方括号 const roleName = userData['primary_role']['name']
内容的提问来源于stack exchange,提问作者Usman Gill
相关产品推荐
相关产品推荐

