编辑:谢谢Kenny和其他回答相似的人。这真的是一个DOH ......我不记得这个傻了。
也许答案是如此简单,它让我不知所措......但我知道有人可以在这上学习我。
所以我有一个相当大的项目,处理大量非常大的JSON,对象,数组等。我需要一种动态访问这些数据的方法,而无需事先了解这些数据的实际名称。我知道someobjectname [string]有效,但我需要[string] [string] [string]等等。换句话说,整个事情必须是完全动态的。
我知道,我知道,这种方法存在性能问题,我确信有更好的方法,但我继承了这个问题而且相信我,这不是改变它的选择。
现在,这里有一个超级简单的例子来证明潜在的问题。我没有找到一种不使用eval()的方法,因为数据不是值得信赖的来源,所以我无法使用它。
在此示例中,假设在运行时之前无法知道foo和bar(对象名称和相应的选项值)。简单来说,它们是用你最喜欢的服务器端代码打印的。
<script>
// Pretend these objects are inserted into
// the DOM dynamically from where ever
// so we don't know the names till runtime
var foo = {
value : "something"
}
var bar = {
value : "something else"
}
window.onload = function() {
function alertValue(option) {
// vvvv This is what I can't do
var selected_object = eval(option.getAttribute("value"));
var selected_value = selected_object.value;
alert(selected_value);
}
var option1 = document.getElementById("option1");
var option2 = document.getElementById("option2");
option1.onclick = function () {
alertValue(this);
}
option2.onclick = function () {
alertValue(this);
}
}
</script>
<html>
<select> <!-- Pretend these values are generated at runtime serverside -->
<option id="option1" value="foo">Foo's value</option>
<option id="option2" value="bar">Bar's value</option>
</select>
</html>
任何帮助都会很棒。我希望这是一个简单的“DOH”时刻。请不要破坏此代码或方法,因为没有意义。它并不像真正的项目那么复杂。这只是一个概念证明,所以你得到了问题。
答案 0 :(得分:3)
如果您在浏览器中执行此操作,则可以使用window
引用全局上下文,因此
var selected_object = window[option.getAttribute("value")];
(或者我不明白你的困难是什么。)
答案 1 :(得分:3)
我不确定这是否是您想要的,但您也可以通过foo
和bar
访问对象window["foo"]
和window["bar"]
。
答案 2 :(得分:2)
foo.bar
和foo["bar"]
在Javascript中的含义相同。后者用于名称不知道直到运行时或作为标识符无效的属性。你可以轻松地链接这个; foo["bar"]["baz"]
表示与foo.bar.baz
相同。