2014-06-14 102 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;} 

這可以工作