如果我使用變量作爲關鍵字,如何訪問多級屬性?JavaScript:使用變量的訪問對象多級屬性
這不是工作:
var obj = {
first: {thirst: "yo"},
second: {beckon: "dud"}
}
var key = "first.thirst";
var result = obj[key];
如果我使用變量作爲關鍵字,如何訪問多級屬性?JavaScript:使用變量的訪問對象多級屬性
這不是工作:
var obj = {
first: {thirst: "yo"},
second: {beckon: "dud"}
}
var key = "first.thirst";
var result = obj[key];
當你使用一個字符串作爲屬性名稱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);
您可以遍歷樹,爲@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));
哦,不容易的單行修正:(但至少這會起作用!謝謝大家! – EricC
兩個註釋:首先,'traverse'是一個可憐的名字:這個函數遍歷對象樹的事實只是一個實現細節,它實際上做的是在對象內部解析路徑;它恰好使用了一個失敗深度優先遍歷;其次,如果路徑無效,這個函數會拋出一個異常,也許這就是你想要的,但是在JavaScript中,通常不會。 –
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;}
這可以工作
你不能,除非你使用'eval'或寫一個自定義函數遍歷樹。 –
把這個放在一個答案中,舉例說明它是如何完成的,我可以接受它作爲答案:) – EricC