当我尝试使用字符串访问全局数组索引的属性时遇到了问题。我有动态生成的字符串,如下所示:
var foo = "arr[0].prp[0].prp[1]"
数组中的索引及其有多深,是动态的,我只是提供一个示例。
现在问题是当我尝试使用这个字符串来获取这样的属性时,它失败了:
foo.something
,foo["something"]
,window[foo].something
或window[foo]["something"]
然而,我可以使用eval()来使其工作,但我真的喜欢在不必使用它的情况下离开。
任何人都有任何建议或想法吗?
答案 0 :(得分:1)
使用eval
可能是一个坏主意,因此我将提供替代解决方案。如果你提供了如何生成字符串,你可以节省必须解析它并重新编写生成器。
您生成的字符串看起来像
var foo = "arr[0].prp[0].prp[1]";
如果你使用像/\[\d+\]|\..*?(?=[\.\[])/ig
这样的 RegExp ,会发生什么?
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]
答案 1 :(得分:1)
<强> *Live Demo 强> *
var part = {
"arr": [
{
"prp": [
{
"prp": [
"result"
]
}
]
}
]
};
var foo = "arr[0].prp[0].prp[0]";
function getValue(obj, chain) {
var keys = chain.split('\.'),
iterable = [];
for (var i = 0, len = keys.length; i < len; i++) {
var parts = keys[i].split('[');
parts[1] = parts[1].replace('\]', '');
iterable.push(parts[0], parts[1]);
}
target = obj[iterable[0]];
for (var j = 1, len = iterable.length; j < len; j++) {
target = target[iterable[j]];
};
return target;
};
答案 2 :(得分:1)
另一种方法:
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);