Javascript 使用字符串访问包含属性的数组

Javascript 使用字符串访问包含属性的数组,javascript,Javascript,当我试图使用字符串访问全局数组索引的属性时,遇到了一个问题。我动态生成的字符串如下所示: var foo=“arr[0].prp[0].prp[1]” 数组中的索引及其深度是动态的,我只是提供了一个示例,说明它可能是什么样子 现在的问题是,当我尝试使用此字符串获取这样的属性时,它失败了: foo.something,foo[“something”],窗口[foo]。something或 window[foo][“某物”] 不过,我可以使用eval()让它工作,但我真的希望不用它就可以离开 有人有

当我试图使用字符串访问全局数组索引的属性时,遇到了一个问题。我动态生成的字符串如下所示:

var foo=“arr[0].prp[0].prp[1]”

数组中的索引及其深度是动态的,我只是提供了一个示例,说明它可能是什么样子

现在的问题是,当我尝试使用此字符串获取这样的属性时,它失败了:

foo.something
foo[“something”]
窗口[foo]。something
window[foo][“某物”]

不过,我可以使用eval()让它工作,但我真的希望不用它就可以离开


有人有什么建议或想法吗?

使用
eval
可能是个坏主意,因此我将提供另一种解决方案。如果您提供了字符串的生成方式,那么您就可以不用解析它,而是重新编写生成器

生成的字符串如下所示

var foo = "arr[0].prp[0].prp[1]";
如果您使用像这样的正则表达式,
/\[\d+\]\..*(?=[\.\[])/ig
,会发生什么

var m = foo.match(/\[\d+\]|\..*?(?=[\.\[])|^.*?(?=[\.\[])/ig);
// ["arr", "[0]", ".prp", "[0]", ".prp", "[1]"]
只是需要更多的分析

m = m.map(function (e) {
    if (e.charAt(0) === '.') return e.slice(1);
    else if (e.charAt(0) === '[') return e.slice(1, -1);
    else return e
});
// ["arr", "0", "prp", "0", "prp", "1"]
现在你可以绕着它转了

var o = window, i;
for (i = 0; i < m.length; ++i) {
    o = o[m[i]];
}
// o is now the result of window.arr[0].prp[0].prp[1]
var o=window,i;
对于(i=0;i
*

var部分={
“arr”:[
{
“prp”:[
{
“prp”:[
“结果”
]
}
]
}
]
};
var foo=“arr[0].prp[0].prp[0]”;
函数getValue(对象、链){
var keys=chain.split('\.'),
iterable=[];
for(变量i=0,len=keys.length;i
还有一种方法:

    var obj = {
        arr: [{
            prp: [{
                prp: ['a', 'b', 'c']
            }]
        }]
    };
    var foo = "arr[0].prp[0].prp[1]";

    var path = foo.replace(/\]/g, "").replace(/\[/g, ".").split('.').reverse();
    var res = obj;
    while (path.length && res){
        var el = path.pop();
        res = res[el];
    }

    console.log(res);

我想到的第一件事是eval。事实上,eval就是为了这个。我仍然想知道这个字符串是如何生成的;将它转换成一个访问器数组至少会允许一些合理的选择。为什么在一个字符串中包含它?这是为了什么?对于那些想知道的人来说,这个字符串是通过单击列表中的一个项目生成的y项。然后我获取该项的id,并基于该id构造一个字符串,以便访问包含列表中所有项信息的数组。直接访问
something
,而不是以字符串格式保存表达式,如下面的
窗口[“arr”][0][“prp”][0][“prp”][1][“something”]
。这肯定会奏效。谢谢,你和@flav为我提供了一些解析字符串的好方法。顺便说一句,我将不得不更多地研究正则表达式,因为在正则表达式方面我真的是个傻瓜。也感谢你提供了一个演示
    var obj = {
        arr: [{
            prp: [{
                prp: ['a', 'b', 'c']
            }]
        }]
    };
    var foo = "arr[0].prp[0].prp[1]";

    var path = foo.replace(/\]/g, "").replace(/\[/g, ".").split('.').reverse();
    var res = obj;
    while (path.length && res){
        var el = path.pop();
        res = res[el];
    }

    console.log(res);