动态地将字符串评估为没有eval()的对象?

时间:2010-07-19 08:52:42

标签: javascript arrays json object eval

编辑:谢谢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”时刻。请不要破坏此代码或方法,因为没有意义。它并不像真正的项目那么复杂。这只是一个概念证明,所以你得到了问题。

3 个答案:

答案 0 :(得分:3)

如果您在浏览器中执行此操作,则可以使用window引用全局上下文,因此

var selected_object = window[option.getAttribute("value")];

(或者我不明白你的困难是什么。)

答案 1 :(得分:3)

我不确定这是否是您想要的,但您也可以通过foobar访问对象window["foo"]window["bar"]

答案 2 :(得分:2)

foo.barfoo["bar"]在Javascript中的含义相同。后者用于名称不知道直到运行时或作为标识符无效的属性。你可以轻松地链接这个; foo["bar"]["baz"]表示与foo.bar.baz相同。

相关问题