【问题标题】:Accessing a JavaScript object using a string使用字符串访问 JavaScript 对象
【发布时间】:2016-06-16 22:13:07
【问题描述】:

我定义了一些简单的对象...

var objectOne = {
    settings: {
        name: "object one"
    }
}

var objectTwo = {
    settings: {
        name: "object two"
    }
}

现在让我们假设我从 URL 中的参数中获得了object - 它以字符串形式出现...

var obj = "objectTwo";

如何使用obj 变量访问objectTwo.settings

我不能执行以下操作,因为obj 是一个字符串:

var settings1 = obj.settings;
var settings2 = [obj].settings; // also doesn't work

我尝试在没有任何运气的情况下剥离引号。

如何使用字符串访问*对象?

【问题讨论】:

  • 如果它在全局命名空间中,您可以使用window[obj].settings
  • ^ 就是这样。使用字符串访问变量的唯一其他方法是使用eval,但几乎没有充分的理由这样做。
  • 我不敢相信我忘记了window。哈。很简单。谢谢!

标签: javascript javascript-objects


【解决方案1】:

window 是一个巧妙的技巧,但你能改变你的数据限制吗?

var objects = {
  objectOne: {
    settings: {
        name: "object one"
    }
  },
  objectTwo: {
    settings: {
        name: "object two"
    }
  }
}

var id = "objectOne";
alert(objects[id].settings.name);

【讨论】:

    【解决方案2】:

    如果它在全局命名空间中,您可以使用window[obj].settings

    如果没有,我认为除了 @MikeC 在 cmets 中提到的 eval 之外,您无能为力,这不是一个好主意。

    【讨论】:

      【解决方案3】:

      好问题。让我们发明一个 Object 方法来动态访问对象属性。 Object.prototype.getNestedValue()无论你的属性位于多深,它都会按顺序接受一系列参数,并为你得到想要的值;

      在这种特殊情况下,它只是一个论点;

      Object.prototype.getNestedValue = function(...a) {
        return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]];
      };
      var objects = {
        objectOne: {
          settings: {
              name: "object one"
          }
        },
        objectTwo: {
          settings: {
              name: "object two"
          }
        }
      },
              obj = "objectTwo";
           result = objects.getNestedValue(obj);
      console.log(JSON.stringify(result));

      您可以看到getNestedValue() 和它的孪生setNestedValue()here 工作

      【讨论】:

      • 我认为您需要在解释中更清楚地说明您已更改 OP 的变量定义以使其成为主对象的属性。