Javascript 以字符串形式按名称获取对象,不使用eval
下面的代码符合我的要求,但我希望避免使用Javascript 以字符串形式按名称获取对象,不使用eval,javascript,jquery,html,node.js,Javascript,Jquery,Html,Node.js,下面的代码符合我的要求,但我希望避免使用eval。Javascript中是否有一个函数可以根据字符串中定义的名称查找对象 myobject = {"foo" : "bar"} myname = "myobject"; eval(myname); 一些上下文:我将其用于一个应用程序,其中dom中的大量节点具有html5数据对象属性,该属性在处理程序函数中用于连接回模型 编辑:myobject既不是全局的也不是局部的,它是在处理程序的父帧之一中定义的 局部变量解决方案: 您可以使用另一个对象的字符
eval
。Javascript中是否有一个函数可以根据字符串中定义的名称查找对象
myobject = {"foo" : "bar"}
myname = "myobject";
eval(myname);
一些上下文:我将其用于一个应用程序,其中dom中的大量节点具有html5数据对象
属性,该属性在处理程序函数中用于连接回模型
编辑:myobject既不是全局的也不是局部的,它是在处理程序的父帧之一中定义的 局部变量解决方案: 您可以使用另一个对象的字符串属性创建要访问的所有对象。例如:
var objectHolder = {
myobject: {"foo" : "bar"},
myobject2: {"foo" : "bar"},
myobject3: {"foo" : "bar"}
};
然后访问所需对象,如下所示:
var desiredObject = objectHolder["myobject"];
window["myobject"];
var objPath = "bar.alpha";
var alphaVal = objPath.split('.')
.reduce(function (object, property) {
return object[property];
}, foo);
// alphaVal === "beta"
全局变量解决方案: 您可以使用如下字符串访问全局变量:
var desiredObject = objectHolder["myobject"];
window["myobject"];
var objPath = "bar.alpha";
var alphaVal = objPath.split('.')
.reduce(function (object, property) {
return object[property];
}, foo);
// alphaVal === "beta"
因为window是一个全局名称空间,所以您可以简单地使用
window[myname]
如果变量是全局变量,则:
myobject = {"foo" : "bar"};
myname = "myobject";
window[myname].foo
本地:
(function(){
myobject = {"foo" : "bar"};
myname = "myobject";
alert( this[myname].foo );
})();
这个问题已经很老了,但由于它是Google上查询“javascript从字符串获取对象”的最高结果,我想我应该分享一种使用点符号的更长对象路径的技术 鉴于以下情况:
var foo = { 'bar': { 'alpha': 'beta' } };
我们可以从如下字符串中获取“alpha”的值:
var desiredObject = objectHolder["myobject"];
window["myobject"];
var objPath = "bar.alpha";
var alphaVal = objPath.split('.')
.reduce(function (object, property) {
return object[property];
}, foo);
// alphaVal === "beta"
如果是全球性的:
window.foo = { 'bar': { 'alpha': 'beta' } };
只需将窗口作为初始值传递给reduce
:
var objPath = "foo.bar.alpha";
var alphaVal = objPath.split('.')
.reduce(function (object, property) {
return object[property];
}, window);
// alphaVal === "beta"
基本上,我们可以使用reduce
通过将初始对象作为initialValue
传递来遍历对象成员
myobject
是局部变量还是全局变量?是否将模型数据保存在变量中?我对MVC没有太多的经验,但通常你希望在你的视图或集合中保留对模型的引用…@ŠimeVidas我知道,先生,只是为了OP的情况。谢谢你的第二个例子是一种误导。它基本上与第一个相同-您定义myobject
而不使用var
(意思是:全局),然后通过window[myname]
访问它(因为在您的情况下,this==window
)。只要您的上下文(您的this
)发生变化,您的示例就不再有效。长话短说:这不是通过名称访问局部变量的方法。你可能忘记了在文章的第一部分用冒号替换等号。