2016-06-16 35 views
1

我有幾個簡單對象訪問定義JavaScript對象...使用字符串

var objectOne = { 
    settings: { 
     name: "object one" 
    } 
} 

var objectTwo = { 
    settings: { 
     name: "object two" 
    } 
} 

現在假設我從URL參數得到了object - 它在作爲一個字符串...

var obj = "objectTwo"; 

如何使用此obj變量訪問objectTwo.settings變量?

我不能這樣做下面的,因爲obj是一個字符串:

var settings1 = obj.settings; 
var settings2 = [obj].settings; // also doesn't work 

我試圖剝離報價沒有任何的運氣。

我如何可以訪問使用字符串中的頂級對象?

+4

工作如果是在全局命名空間,你可以使用'窗口[OBJ] .settings'。 – Quantastical

+1

^就是這樣。使用字符串訪問變量的唯一方法是使用'eval',但幾乎沒有理由這麼做。 –

+0

我不能相信我忘了'窗口'。哈。很簡單。謝謝! – dmathisen

回答

1

如果是在全局命名空間,你可以使用window[obj].settings

如果沒有,我不認爲有什麼可以除eval做的@MikeC在評論中提到的,這是很少一個好主意。

2

window是一個巧妙的方法,但你能可能改變你的數據狹窄?

var objects = { 
    objectOne: { 
    settings: { 
     name: "object one" 
    } 
    }, 
    objectTwo: { 
    settings: { 
     name: "object two" 
    } 
    } 
} 

var id = "objectOne"; 
alert(objects[id].settings.name); 
1

好問題。讓我們發明一個Object方法來動態訪問對象屬性。無論你的財產所處的位置有多深,它都會按順序進行一系列的論證,併爲你獲得所需的價值。

在這種特殊情況下,它只是一個參數;

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 
var objects = { 
 
    objectOne: { 
 
    settings: { 
 
     name: "object one" 
 
    } 
 
    }, 
 
    objectTwo: { 
 
    settings: { 
 
     name: "object two" 
 
    } 
 
    } 
 
}, 
 
     obj = "objectTwo"; 
 
    result = objects.getNestedValue(obj); 
 
console.log(JSON.stringify(result));

你可以看到getNestedValue()和它的孿生setNestedValue()here

+0

我想你需要在你的解釋中說明你已經改變了OP的變量定義,使它們成爲主對象的屬性。 – nnnnnn