2012-08-12 98 views
6

下面的代码做我想要的,但我想避免eval。 Javascript中是否有一个函数根据字符串中的名称查找对象?获取对象的名称作为没有eval的字符串

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

一些背景:我用这一个应用程序中,DOM中的大量节点有一个HTML5 data-object属性,这是在处理函数用于连接回模型。

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

+1

myobject是一个本地或全局变量吗? – 2012-08-12 18:36:32

+0

您将模型数据保存在变量中吗?我对MVC没有多少经验,但通常你想在你的视图或集合中保留对模型的引用...... – 2012-08-12 18:39:51

回答

13

如果变量是那么全球:

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

DEMO

对于本地:

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

DEMO

+0

@ŠimeVidas我知道,先生,只是OP的情况。谢谢 – thecodeparadox 2012-08-12 18:43:42

+1

你的第二个例子是一种误导。它基本上和第一个一样 - 你定义'myobject'没有'var'(意思是:全局的),然后通过'window [myname]'来访问它(因为'this === window',在你的情况下)。 只要你的上下文(你的'this')发生了变化,你的例子就不会再起作用了。长话短说:这不是一种通过名称访问本地变量的方法。 – Loilo 2015-12-10 00:44:08

11

局部变量解决方案:

你可以做的是要与其他对象的字符串的属性来访问的所有对象。例如:

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

,然后访问所需的对象是这样的:

var desiredObject = objectHolder["myobject"]; 

全局变量的解决方案:

您可以访问使用这样的字符串全局变量:

window["myobject"]; 
+0

你可能忘了在帖子的第一部分用冒号代替等号。 – darksky 2012-08-12 19:53:55

+0

@darksky - 是的,我做到了。感谢您指出了这一点。 – jeff 2012-08-12 20:06:14

3

,因为窗口是一个全局命名空间,你可以简单地使用

window[myname] 
0

这个问题是很老,但因为它是在谷歌上的结果对于查询“的JavaScript字符串从获取对象”,我想我会分享的技术,使用点符号长对象路径。

考虑以下几点:

var objPath = "bar.alpha"; 

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

    return object[property]; 
    }, foo); 

// alphaVal === "beta" 

如果它是全球:

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

我们可以从这样的字符串得到 '阿尔法' 的值

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

只是传递window作为initialValue对于reduce

var objPath = "foo.bar.alpha"; 

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

    return object[property]; 
    }, window); 

// alphaVal === "beta" 

基本上我们可以使用reduce通过传入最初的对象作为initialValue来遍历对象成员。

MDN article for Array.prototype.reduce

相关问题