15

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

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

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

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

4

4 回答 4

22

如果变量是全局的,那么:

myobject = {"foo" : "bar"};
myname = "myobject";
window[myname].foo

演示

对于本地:

(function(){
    myobject = {"foo" : "bar"};
    myname = "myobject";
    alert( this[myname].foo );
})();

演示

于 2012-08-12T18:41:53.250 回答
14

局部变量解决方案:

您可以使用另一个对象的字符串属性来创建要访问的所有对象。例如:

var objectHolder = {
    myobject: {"foo" : "bar"},
    myobject2: {"foo" : "bar"},
    myobject3: {"foo" : "bar"}
};

然后像这样访问您想要的对象:

var desiredObject = objectHolder["myobject"];

全局变量解决方案:

您可以使用如下字符串访问全局变量:

window["myobject"];
于 2012-08-12T18:38:39.107 回答
7

这个问题很老了,但由于它是 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作为initialValuefor传递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 文章

于 2016-11-24T19:56:30.203 回答
3

由于 window 是一个全局命名空间,你可以简单地使用

window[myname]
于 2012-08-12T18:41:12.367 回答