【问题标题】:Evaluate string as Object without eval() dynamically?动态地将字符串评估为没有 eval() 的对象?
【发布时间】:2010-07-19 08:52:41
【问题描述】:

编辑:感谢肯尼和其他类似回答的人。真的是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”时刻。请不要撕开这段代码或方法,因为没有意义。它并不像真正的项目那样复杂。这只是一个概念证明,所以您会遇到问题。

【问题讨论】:

    标签: javascript arrays json object eval


    【解决方案1】:

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

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

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

    【讨论】:

    • 宾果游戏。正如我所料,这是一个“DOH”。太明显了,我什至没有考虑。我会说是时候喝鸡尾酒了。希望你可以自己享受!非常感谢。
    【解决方案2】:

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

    【讨论】:

    • 确实如此。我什至在我的问题中显示了“someobjectname [string]”,但不记得 window[string][string][string][etc] 有效。肯尼在上下文中发布了一个示例,以便偶然发现此内容的其他人完全理解它,因此他赢得了“已回答”的分数。但是非常感谢您的提醒!这个地方永远不会失败!
    【解决方案3】:

    foo.barfoo["bar"] 在 Javascript 中的含义相同。后者用于名称在运行时未知或作为标识符无效的属性。您可以轻松地将其链接起来; foo["bar"]["baz"]foo.bar.baz 含义相同。

    【讨论】:

    • 是的,我知道的就这么多,甚至在我的例子中也用到了。 foo 本身需要是一个动态字符串。因此:window[string][string][string][etc] 无论如何谢谢!
    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2010-12-17
    • 2023-04-11
    • 2011-08-03
    相关资源
    最近更新 更多