获取对象的名称作为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
作为initialValue
值reduce
:
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文章