获取对象的名称作为string没有评估

下面的代码做我想要的,但我想避免eval 。 在Javascript中有一个函数根据string中定义的名称查找对象吗?

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

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

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

如果variables是全局的,则:

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

DEMO

对于本地:

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

DEMO

局部variables解答:

您可以使用另一个对象的string属性制作所有要访问的对象。 例如:

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

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

 var desiredObject = objectHolder["myobject"]; 

全局variables解决scheme

你可以像这样使用string访问全局variables:

 window["myobject"]; 

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

 window[myname] 

这个问题是相当古老的,但因为它是谷歌查询“从string的JavaScript获取对象”的最高结果,我想我会分享一个技术,使用点符号较长的对象path。

鉴于以下情况:

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

我们可以从这样一个string中得到'alpha'的值:

 var objPath = "bar.alpha"; var alphaVal = objPath.split('.') .reduce(function (object, property) { return object[property]; }, foo); // alphaVal === "beta" 

如果它是全球性的:

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

只要传递window作为initialValuereduce

 var objPath = "foo.bar.alpha"; var alphaVal = objPath.split('.') .reduce(function (object, property) { return object[property]; }, window); // alphaVal === "beta" 

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

针对Array.prototype.reduce的MDN文章