使用eval
可能不是一个好主意,所以我将提供一个替代解决方案。如果您提供了字符串的生成方式,则可以省去解析它并改写生成器的麻烦。
您生成了一个字符串,看起来像
var foo = "arr[0].prp[0].prp[1]";
如果你使用这样的RegExp/\[\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]