【问题标题】:Get object by name as string without eval按名称获取对象作为不带 eval 的字符串
【发布时间】:2012-08-09 02:48:56
【问题描述】:

下面的代码做了我想要的,但我想避免eval。 Javascript 中是否有一个函数可以通过字符串中定义的名称来查找对象?

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

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

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

【问题讨论】:

  • myobject 是局部变量还是全局变量?
  • 您将模型数据保存在变量中?我对 MVC 没有太多经验,但通常您希望在视图或集合中保留对模型的引用...

标签: javascript jquery html node.js


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多