如何在JavaScript中通过字符串动态访问对象属性?
如何通过字符串路径动态访问对象属性?
当然可以实现。你目前的代码里直接用obj[0].structure是行不通的,因为structure是字符串,JavaScript会把它当成对象的属性名来访问,而不是解析成嵌套路径。下面是几种可靠的实现方式:
方法一:拆分路径片段遍历访问(推荐,安全且兼容性好)
写一个通用工具函数,把路径字符串按.分割成片段,然后逐层遍历对象的属性:
// 通用函数:根据路径字符串获取对象嵌套属性 function getNestedProperty(obj, path) { const pathSegments = path.split('.'); let currentValue = obj; for (const segment of pathSegments) { // 如果当前层级不存在,直接返回undefined避免报错 if (!currentValue) return undefined; currentValue = currentValue[segment]; } return currentValue; } // 修改你的fun1函数 function fun1(structure) { const obj = [{"header":{"orderNumber": "a", "item": 1}}, {"header":{"orderNumber": "b", "item": 1}}]; const newObj = getNestedProperty(obj[0], structure); console.log(newObj); } // 调用示例 function fun2() { const structure = 'header.orderNumber'; fun1(structure); } function fun3() { const structure = 'header.item'; fun1(structure); } fun2(); // 输出 "a" fun3(); // 输出 1
方法二:使用eval(仅适用于可信路径)
如果能保证路径字符串来自完全可信的来源,也可以用eval直接解析,但要注意eval存在安全风险,绝对不可用于处理用户输入等不可信内容:
function getNestedPropertyWithEval(obj, path) { try { return eval(`obj.${path}`); } catch (error) { return undefined; } } // 使用方式和方法一一致 const value = getNestedPropertyWithEval(obj[0], 'header.item');
额外说明
- 原示例代码存在几个语法问题:
obj未用const/let声明(会变成全局变量)、第二个fun2定义重复且语法错误,上面的代码已经修正了这些问题。 - 如果路径中包含数组下标(比如
header.items[0].name),可以修改拆分逻辑,先把下标转换成.分割的形式(比如header.items.0.name)再遍历,或者在循环中判断并处理下标格式。
内容的提问来源于stack exchange,提问作者Douglas Correa
相关产品推荐
相关产品推荐

