如何使用动态列名访问JavaScript深层对象属性?
解决深层对象属性访问问题
你当前的代码有两个核心问题:
testObject.testCol是在直接访问testObject里名为testCol的属性,而非使用变量testCol的值作为访问路径;- 字符串形式的深层路径(比如
"a.b.c")无法直接通过点语法访问对象的嵌套属性,所以才会返回undefined。
下面是几种实用的解决方法:
方法1:拆分路径+reduce逐层访问(推荐)
把路径字符串按.拆分成数组,用reduce配合可选链操作符?.逐层访问,既简洁又能避免路径不存在时的报错:
const testObject = { a: { b: { c: 'hello' } } } const testCol = "a.b.c" const pathSegments = testCol.split('.'); const targetValue = pathSegments.reduce((currentObj, key) => currentObj?.[key], testObject); console.log(targetValue); // 输出 'hello'
如果路径中某一层不存在(比如"a.x.c"),这段代码会返回undefined而不会抛出错误。
方法2:封装成可复用工具函数
如果需要频繁处理这类场景,可以把逻辑封装成工具函数,方便调用:
function getNestedProperty(obj, path) { return path.split('.').reduce((current, key) => { return current?.[key]; }, obj); } // 使用示例 const testObject = { a: { b: { c: 'hello' } } } const testCol = "a.b.c"; console.log(getNestedProperty(testObject, testCol)); // 输出 'hello' console.log(getNestedProperty(testObject, "a.x.y")); // 输出 undefined
方法3:循环遍历路径(基础易懂版)
如果你不想用reduce,也可以用普通循环实现同样的逻辑:
const testObject = { a: { b: { c: 'hello' } } } const testCol = "a.b.c" const pathSegments = testCol.split('.'); let currentValue = testObject; for (const key of pathSegments) { if (!currentValue) break; currentValue = currentValue[key]; } console.log(currentValue); // 输出 'hello'
内容的提问来源于stack exchange,提问作者Nagesh
相关产品推荐
相关产品推荐

