2012-08-12 164 views
6

下面的代碼做我想要的,但我想避免eval。 Javascript中是否有一個函數根據字符串中的名稱查找對象?獲取對象的名稱作爲沒有eval的字符串

myobject = {"foo" : "bar"} 
myname = "myobject"; 
eval(myname); 

一些背景:我用這一個應用程序中,DOM中的大量節點有一個HTML5 data-object屬性,這是在處理函數用於連接回模型。

編輯:myobject既不是全局的也不是本地的,它在處理程序的父框架之一中定義。

+1

myobject是一個本地或全局變量嗎? – 2012-08-12 18:36:32

+0

您將模型數據保存在變量中嗎?我對MVC沒有多少經驗,但通常你想在你的視圖或集合中保留對模型的引用...... – 2012-08-12 18:39:51

回答

13

如果變量是那麼全球:

myobject = {"foo" : "bar"}; 
myname = "myobject"; 
window[myname].foo 

DEMO

對於本地:

(function(){ 
    myobject = {"foo" : "bar"}; 
    myname = "myobject"; 
    alert(this[myname].foo); 
})(); 

DEMO

+0

@ŠimeVidas我知道,先生,只是OP的情況。謝謝 – thecodeparadox 2012-08-12 18:43:42

+1

你的第二個例子是一種誤導。它基本上和第一個一樣 - 你定義'myobject'沒有'var'(意思是:全局的),然後通過'window [myname]'來訪問它(因爲'this === window',在你的情況下)。 只要你的上下文(你的'this')發生了變化,你的例子就不會再起作用了。長話短說:這不是一種通過名稱訪問本地變量的方法。 – Loilo 2015-12-10 00:44:08

11

局部變量解決方案:

你可以做的是要與其他對象的字符串的屬性來訪問的所有對象。例如:

var objectHolder = { 
    myobject: {"foo" : "bar"}, 
    myobject2: {"foo" : "bar"}, 
    myobject3: {"foo" : "bar"} 
}; 

,然後訪問所需的對象是這樣的:

var desiredObject = objectHolder["myobject"]; 

全局變量的解決方案:

您可以訪問使用這樣的字符串全局變量:

window["myobject"]; 
+0

你可能忘了在帖子的第一部分用冒號代替等號。 – darksky 2012-08-12 19:53:55

+0

@darksky - 是的,我做到了。感謝您指出了這一點。 – jeff 2012-08-12 20:06:14

3

,因爲窗口是一個全局命名空間,你可以簡單地使用

window[myname] 
0

這個問題是很老,但因爲它是在谷歌上的結果對於查詢「的JavaScript字符串從獲取對象」,我想我會分享的技術,使用點符號長對象路徑。

考慮以下幾點:

var objPath = "bar.alpha"; 

var alphaVal = objPath.split('.') 
    .reduce(function (object, property) { 

    return object[property]; 
    }, foo); 

// alphaVal === "beta" 

如果它是全球:

var foo = { 'bar': { 'alpha': 'beta' } }; 

我們可以從這樣的字符串得到 '阿爾法' 的值

window.foo = { 'bar': { 'alpha': 'beta' } }; 

只是傳遞window作爲initialValue對於reduce

var objPath = "foo.bar.alpha"; 

var alphaVal = objPath.split('.') 
    .reduce(function (object, property) { 

    return object[property]; 
    }, window); 

// alphaVal === "beta" 

基本上我們可以使用reduce通過傳入最初的對象作爲initialValue來遍歷對象成員。

MDN article for Array.prototype.reduce

相關問題