通过名称获取对象,而不是eval

Jer*_*oen 11 html javascript jquery html5 node.js

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

myobject = {"foo" : "bar"}
myname = "myobject";
eval(myname);
Run Code Online (Sandbox Code Playgroud)

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

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

the*_*dox 17

如果变量是全局变量,则:

myobject = {"foo" : "bar"};
myname = "myobject";
window[myname].foo
Run Code Online (Sandbox Code Playgroud)

DEMO

对于本地:

(function(){
    myobject = {"foo" : "bar"};
    myname = "myobject";
    alert( this[myname].foo );
})();
Run Code Online (Sandbox Code Playgroud)

DEMO

  • 您的第二个例子是一种误导。它与第一个基本相同-您定义不带var的myobject(意味着:全局),然后通过window [myname]访问它(因为在您的情况下为this === window)。一旦您的上下文(您的“ this”)更改,您的示例将不再起作用。长话短说:这不是通过名称访问局部变量的方法。 (2认同)

jef*_*eff 12

局部变量解决方案

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

var objectHolder = {
    myobject: {"foo" : "bar"},
    myobject2: {"foo" : "bar"},
    myobject3: {"foo" : "bar"}
};
Run Code Online (Sandbox Code Playgroud)

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

var desiredObject = objectHolder["myobject"];
Run Code Online (Sandbox Code Playgroud)

全局变量解决方案

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

window["myobject"];
Run Code Online (Sandbox Code Playgroud)


小智 5

这个问题已经很老了,但由于它是 Google 上查询“javascript get object from string”的最高结果,我想我会分享一种使用点表示法获得更长对象路径的技术。

鉴于以下情况:

var foo = { 'bar': { 'alpha': 'beta' } };
Run Code Online (Sandbox Code Playgroud)

我们可以从这样的字符串中获取 'alpha' 的值:

var objPath = "bar.alpha";

var alphaVal = objPath.split('.')
  .reduce(function (object, property) {

    return object[property];
  }, foo);

// alphaVal === "beta"
Run Code Online (Sandbox Code Playgroud)

如果是全局的:

window.foo = { 'bar': { 'alpha': 'beta' } };
Run Code Online (Sandbox Code Playgroud)

只需window作为initialValuefor传递reduce

var objPath = "foo.bar.alpha";

var alphaVal = objPath.split('.')
  .reduce(function (object, property) {

    return object[property];
  }, window);

// alphaVal === "beta"
Run Code Online (Sandbox Code Playgroud)

基本上我们可以reduce通过将初始对象作为initialValue.

Array.prototype.reduce 的 MDN 文章