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
)发生变化,您的示例就不再有效。长话短说:这不是通过名称访问局部变量的方法。你可能忘记了在文章的第一部分用冒号替换等号。