通过名称获取对象,而不是eval

时间:2012-08-12 18:34:54

标签: javascript jquery html html5 node.js

下面的代码符合我的要求,但我想避免使用eval。 Javascript中是否有一个函数按字符串中的名称查找对象?

myobject = {"foo" : "bar"}
myname = "myobject";
eval(myname);

某些上下文:我将此用于一个应用程序,其中dom中的大量节点具有html5 data-object属性,该属性在处理函数中用于连接回模型。

编辑:myobject既不是全局的也不是本地的,它是在处理程序的一个父框架中定义的。

4 个答案:

答案 0 :(得分:15)

如果变量是全局的,那么:

myobject = {"foo" : "bar"};
myname = "myobject";
window[myname].foo

<强> DEMO

对于本地:

(function(){
    myobject = {"foo" : "bar"};
    myname = "myobject";
    alert( this[myname].foo );
})();

<强> DEMO

答案 1 :(得分:12)

本地变量解决方案:

您可以使用另一个对象的字符串属性创建要访问的所有对象。例如:

var objectHolder = {
    myobject: {"foo" : "bar"},
    myobject2: {"foo" : "bar"},
    myobject3: {"foo" : "bar"}
};

然后像这样访问您想要的对象:

var desiredObject = objectHolder["myobject"];

全局变量解决方案:

您可以使用如下字符串访问全局变量:

window["myobject"];

答案 2 :(得分:3)

因为window是全局命名空间,所以你可以简单地使用

window[myname]

答案 3 :(得分:2)

这个问题已经过时了,但由于它是Google搜索查询的最佳结果,因此javascript从字符串&#34;获取对象,我以为我会分享更长对象的技术使用点表示法的路径。

鉴于以下内容:

var foo = { 'bar': { 'alpha': 'beta' } };

我们可以获得&#39; alpha&#39;来自这样的字符串:

var objPath = "bar.alpha";

var alphaVal = objPath.split('.')
  .reduce(function (object, property) {

    return object[property];
  }, foo);

// alphaVal === "beta"

如果它是全球性的:

window.foo = { 'bar': { 'alpha': 'beta' } };

只需将window作为initialValue的{​​{1}}传递:

reduce

基本上我们可以使用var objPath = "foo.bar.alpha"; var alphaVal = objPath.split('.') .reduce(function (object, property) { return object[property]; }, window); // alphaVal === "beta" 来遍历对象成员,方法是将初始对象作为reduce传递。

MDN article for Array.prototype.reduce