2011-09-28 115 views
2

var string = 'object.data.path';字符串作爲對象變量的對象引用

這是一個類似於變量路徑的字符串。

如何從該字符串返回相應的變量?

喜歡的東西轉化串入return object.data.path;

這背後的事情是該字符串可能是更長的時間(深),如:

var string = 'object.data.path.original.result';

+0

字符串從哪裏來? – Dennis

+0

HTML5數據屬性名稱,破折號用點代替。 – jolt

回答

3
function GetPropertyByString(stringRepresentation) { 
    var properties = stringRepresentation.split("."), 
     myTempObject = window[properties[0]]; 
    for (var i = 1, length = properties.length; i<length; i++) { 
    myTempObject = myTempObject[properties[i]]; 
    } 

    return myTempObject; 
} 


alert(GetPropertyByString("object.data.path")); 

這是假定你的第一個(在這種情況下,稱爲object是全球性的) 或者,雖然不推薦,但可以使用eval函數。

+0

謝謝!已經作出了類似的功能,但希望有除了循環以外的其他方式.. – jolt

+0

管理單元! (好吧,差不多......) – nnnnnn

+0

對於每次迭代,你應該檢查'myTempObject'是否仍然是一個對象,然後才能檢索它的屬性... –

3

假設你不想只是使用eval你可以嘗試這樣的事:

function stringToObjRef(str) { 
    var keys = str.split('.'), 
     obj = window; 
    for (var i=0; i < keys.length; i++) { 
     if (keys[i] in obj) 
     obj = obj[keys[i]]; 
     else 
     return; 
    } 

    return obj; 
} 

console.log(stringToObjRef('object.data.path.original.result')); 

使用for循環去下一層的時間,返回undefined如果鏈中的一個特定的鍵未定義。

+0

謝謝,由於聲譽較低而給予Chips_100獎勵。一個獎金壽'未定義的回報。 – jolt

+0

謝謝。 (必須花費額外的時間來考慮讓Chips_100在我之前回答的未定義測試。)關於您對Chips有關尋找無循環方式的評論,您可以使用函數遞歸來實現... – nnnnnn

+0

函數遞歸仍然是一個循環,而不是一個「記錄」的循環。 – jolt