如何存储对象路径?将对象路径存入变量失败求助
解决嵌套对象路径访问的问题
我来帮你捋清楚问题出在哪,以及怎么解决~
首先看你写的这段代码:
var object = {"india": { "chennai" : {"sholing":"hi"}}}; var path = ['india']['chennai']['sholing']; console.log( object.india.chennai ); //works console.log( object[path] ); //not works
为什么原来的写法不行?
你以为['india']['chennai']['sholing']是把对象的路径存成变量,但实际上这行代码的逻辑完全不是这么回事:
- 先创建了一个仅包含
'india'的数组 - 接着尝试访问这个数组的
chennai属性——数组本身根本没有这个属性,所以得到undefined - 最后再访问
undefined的sholing属性,结果还是undefined
所以最后path的值是undefined,用object[undefined]自然取不到你想要的嵌套属性啦。
正确的实现方式
我们需要把路径存成字符串数组,然后通过遍历数组来逐层访问对象的嵌套属性,给你两种常用方案:
方案1:用数组存储路径 + reduce遍历
var object = {"india": { "chennai" : {"sholing":"hi"}}}; // 把路径拆成字符串数组 const path = ['india', 'chennai', 'sholing']; // 写一个工具函数来逐层获取嵌套值 function getNestedProperty(obj, pathArr) { // 用reduce遍历路径,?.是可选链操作符,避免路径不存在时报错 return pathArr.reduce((currentObj, key) => currentObj?.[key], obj); } console.log(getNestedProperty(object, path)); // 输出: hi // 如果只想访问到chennai层,就取数组的前两项 console.log(getNestedProperty(object, ['india', 'chennai'])); // 输出: { sholing: 'hi' }
方案2:用点分隔的字符串路径(可选)
如果你习惯用"india.chennai.sholing"这种字符串形式的路径,可以先把它转成数组再用上面的函数:
var object = {"india": { "chennai" : {"sholing":"hi"}}}; const pathStr = 'india.chennai.sholing'; const pathArr = pathStr.split('.'); console.log(getNestedProperty(object, pathArr)); // 输出: hi
额外提醒
尽量不要用eval()来实现这个需求,虽然eval(object.${pathStr})看起来能行,但eval会执行任意代码,存在安全风险,尤其是当路径来自用户输入的时候,绝对不要用。
内容的提问来源于stack exchange,提问作者user2024080
相关产品推荐
相关产品推荐

