【问题标题】:JavaScript: Access object multi-level property using variable [duplicate]JavaScript:使用变量访问对象多级属性[重复]
【发布时间】:2014-08-04 23:40:03
【问题描述】:

如果我使用变量作为键,如何访问多级属性?

这不起作用:

var obj = {
    first: {thirst: "yo"},
    second: {beckon: "dud"}
}
var key = "first.thirst";
var result = obj[key];

【问题讨论】:

  • 你不能,除非你使用eval或者写一个自定义函数来遍历树。
  • 把它放在一个答案中,并举例说明它是如何完成的,我可以接受它作为答案:)

标签: javascript


【解决方案1】:

当您在 JavaScript 中使用字符串作为属性名称时,没有任何字符是禁止使用的:包括句点。所以你可以很容易地拥有这样的对象属性:

var o = {
    'first.second.third': 'value';
}

鉴于此,显然不可能实施您的解决方案。

但是,只要您不在属性命名中使用句点,您就可以创建一个执行此操作的函数:

function resolve(obj, path){
    path = path.split('.');
    var current = obj;
    while(path.length) {
        if(typeof current !== 'object') return undefined;
        current = current[path.shift()];
    }
    return current;
}

然后你可以调用:

var key = "first.thirst";
var result = resolve(obj, key);

【讨论】:

    【解决方案2】:

    正如@RobW 所说,您可以遍历树:

    var traverse = function (obj, keys) {
        return keys.split('.').reduce(function (cur, key) {
            return cur[key];
        }, obj);
    };
    
    var obj = {
        first: { thirst: 'yo' },
        second: { beckon: 'dud' }
    };
    var keys = 'first.thirst';
    console.log(traverse(obj, keys));

    【讨论】:

    • 哦,没有简单的单行修复 :( 但至少这会奏效!谢谢大家!
    • 两个厘米。首先,traverse 是一个糟糕的名字:这个函数遍历对象树的事实只是一个实现细节。它实际上在做的是解析对象内的路径;它恰好使用了一个失败的深度优先遍历。其次,如果路径无效,此函数将引发异常。也许这就是你想要的,但在 JavaScript 中,通常不是。否则,干得好!
    【解决方案3】:
    function getMultiLevelProp(obj, key){
    if(typeof obj == "object"){
        var keyQueue = key.split(".").reverse();
    
        var tempVal = obj, currentKey;
        while((currentKey = keyQueue.pop()) != undefined)
                tempVal = tempVal[currentKey];
    
        return tempVal;
    }
    
    return false;}
    

    这可以工作

    【讨论】:

      猜你喜欢
      • 2012-11-28
      • 2012-06-30
      • 2017-06-09
      • 1970-01-01
      • 2015-03-13
      • 2011-06-10
      • 2020-09-12
      • 2011-05-14
      • 2013-12-07
      相关资源
      最近更新 更多