按名称获取对象作为不带 eval 的字符串
Posted
技术标签:
【中文标题】按名称获取对象作为不带 eval 的字符串【英文标题】:Get object by name as string without eval 【发布时间】:2012-08-09 02:48:56 【问题描述】:下面的代码做了我想要的,但我想避免eval
。 javascript 中是否有一个函数可以通过字符串中定义的名称来查找对象?
myobject = "foo" : "bar"
myname = "myobject";
eval(myname);
一些上下文:我将它用于一个应用程序,其中 dom 中的大量节点具有 html5 data-object
属性,该属性在处理函数中用于连接回模型。
编辑:myobject 既不是全局的也不是本地的,它是在处理程序的父框架之一中定义的。
【问题讨论】:
myobject
是局部变量还是全局变量?
您将模型数据保存在变量中?我对 MVC 没有太多经验,但通常您希望在视图或集合中保留对模型的引用...
【参考方案1】:
局部变量解:
您可以使用另一个对象的字符串属性来创建您想要访问的所有对象。例如:
var objectHolder =
myobject: "foo" : "bar",
myobject2: "foo" : "bar",
myobject3: "foo" : "bar"
;
然后像这样访问你想要的对象:
var desiredObject = objectHolder["myobject"];
全局变量解决方案:
您可以使用这样的字符串访问全局变量:
window["myobject"];
【讨论】:
您可能忘记在帖子的第一部分用冒号替换等号。【参考方案2】:因为 window 是一个全局命名空间,你可以简单地使用
window[myname]
【讨论】:
【参考方案3】:如果变量是全局的,那么:
myobject = "foo" : "bar";
myname = "myobject";
window[myname].foo
DEMO
对于本地:
(function()
myobject = "foo" : "bar";
myname = "myobject";
alert( this[myname].foo );
)();
DEMO
【讨论】:
@ŠimeVidas 我知道先生,仅针对 OP 的情况。谢谢 你的第二个例子是一种误导。它与第一个基本相同 - 您定义myobject
没有 var
(意味着:全局)然后通过 window[myname]
访问它(因为 this === window
,在您的情况下)。一旦您的上下文(您的this
)发生变化,您的示例将不再有效。长话短说:这不是按名称访问局部变量的方法。【参考方案4】:
这个问题已经很老了,但由于它是 Google 上查询“javascript get object from string”的最高结果,我想我会分享一种使用点表示法的更长对象路径的技术。
鉴于以下情况:
var foo = 'bar': 'alpha': 'beta' ;
我们可以从这样的字符串中获取 '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
传入。
MDN article for Array.prototype.reduce
【讨论】:
以上是关于按名称获取对象作为不带 eval 的字符串的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript对象:按名称作为字符串访问变量属性[重复]