使用string获取全局对象的成员

时间:2014-02-28 16:36:21

标签: javascript

我有一个全局javascript对象,它有子成员,我需要通过提供的字符串访问它的成员。该对象看起来像:

var student = {
    0 : {
        name : "a",
        level : 2
      }
    1 : {
        name : "b",
        level : 3
      }
      ...

我希望像使用顶级字符串一样访问它:

   this["student[0]['name']"];   // returns undefined
   window["student[0]['name']"]; // same here

但这仅适用于变量名称:

  this["student"];    // returns the student object
  window["student"];  // same

这可以吗?或者用

定义成员的正确方法是什么
var accesskey = 'student[0]["name"]';

谢谢。

2 个答案:

答案 0 :(得分:1)

假设accessKey的格式已修复且无法更改,您基本上只有两个选择:

  1. 自己解析字符串,然后使用每个级别的相关键进行处理。该字符串很容易拆分:

    var parts = accessKey.split(/[\[\]"]+/);
    

    (请务必将""视为parts中的第一个或最后一个条目。)

  2. 使用eval

    var val = eval(accessKey);
    

    但只有在您完全控制该字符串时才能这样做。切勿在您无法控制的输入上使用eval,并且即使控制输入也不要使用它。

答案 1 :(得分:0)

我真的不建议尝试使用"student[0]['name']"形式的密钥来访问某个值,因为这需要eval()。相反,你可以在表单中有一个键 ['student', 0, 'name']。在此表单中,您可以使用键来访问结构的任何嵌套部分。

您需要一个能够首先将该键解析为嵌套值的函数:

function get_nested_value(key, source) {
    var sub = source || window;
    for (var i = 0; i < key.length; ++i) {
        sub = sub[key[i]];
    }
    return sub;
}

然后可以获得该值:

var key = ['student', 0, 'name'];
var value = get_nested_value(key);

如果你真的开始严格按照'student[0]["name"]'格式的字符串使用密钥,那么你必须采用{{3}给出的eval()方法但是eval()通常不安全。