2014-06-14 67 views
3

如果我使用变量作为关键字,如何访问多级属性?JavaScript:使用变量的访问对象多级属性

这不是工作:

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

你不能,除非你使用'eval'或写一个自定义函数遍历树。 –

+0

把这个放在一个答案中,举例说明它是如何完成的,我可以接受它作为答案:) – EricC

回答

10

当你使用一个字符串作为属性名称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));

+0

哦,不容易的单行修正:(但至少这会起作用!谢谢大家! – EricC

+0

两个注释:首先,'traverse'是一个可怜的名字:这个函数遍历对象树的事实只是一个实现细节,它实际上做的是在对象内部解析路径;它恰好使用了一个失败深度优先遍历;其次,如果路径无效,这个函数会抛出一个异常,也许这就是你想要的,但是在JavaScript中,通常不会。 –

1
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;} 

这可以工作