鉴于我有以下内容:(动态生成并且长度不同)
associations = ["employer", "address"];
尝试遍历JSON对象,并希望形成如下内容:
data.employer.address
或
data[associations[0]][association[1]]
不这样做:
eval("data."+associations.join('.'));
最后,我可能会因此而避而不谈,但是在这样的实例中使用eval是否可以?只需检索数据。
答案 0 :(得分:1)
为什么不迭代您的关联?
function traverse(data, associations){
for (var i=0; i<associations.length; i++){
data = data[associations[i]];
}
return data;
}
您的eval方法必须生成一个新字符串并解析代码,然后才能开始遍历。
答案 1 :(得分:0)
这是使用Prototype的一种方式。
$A(associations).inject(data, function (obj, method) {
return obj[method];
});
如果您可以保证用户无法影响您传递给它的字符串,那么使用eval
就可以了。如果您的输入来自用户或来自用户可能更改的网址,则应该避免eval
。
答案 2 :(得分:0)
您始终可以创建动态脚本节点。例如:
var yo = document.createElement("script");
yo.setAttribute("type", "text/javascript");
yo.innerHTML = "alert('yo!');";
document.body.appendChild(yo);
不需要评估。