2012-01-21 35 views
1

我想知道如何作出以下我有以下數據:我將如何使用括號表示法中的單個變量訪問深層值?

dta = { 
     "fielddata": { 
      "text1": "4B030C2E-3D53-4DF8-A3535EF377B45DE5", 
      "text2": "Unlabeled" 
     } 
} 

,我可以訪問使用括號標記,像這樣

var result = dta["fielddata"]["text1"]; 

沒有問題存在,我可以像使用變量所以

var val1 = "fielddata", 
    val2 = "text1", 
    acc = dta[val1][val2]; 

log(acc); 

再次,很棒 - 但如何只有一個變量持有點符號?

一樣,如果我只有

var val = "fielddata.text1", 
    acc = dta[val]; 
log(acc); 

這將產生一個未定義的。 關於如何去做這件事的任何想法?

非常感謝! 馬爾科

回答

5
var val = "fielddata.text1", 
    acc = dta,    // reference the base object 
    parts = val.split('.'), // split the val into an Array of individual parts 
    i; 

    // Iterate the parts, updating acc each time 
for(i = 0; i < parts.length; i++) 
    acc = acc[parts[i]]; 
+0

這是完美的獲得,但你會如何改變? – coiso

2

另一種選擇是JSONPath。對於相對簡單的用例,手動執行可能是一個更好的解決方案,但更復雜的情況下,我可能會使用更加正式的方法。

雖然我討厭建議它,總有eval('dta.fielddata.text1')

+0

我不認爲JSONPath會在這種情況下提供幫助。他希望從數據中獲取數據,而不是使用路徑從另一個對象中獲取數據。 – Pointy

+0

@積分我不確定那是什麼意思; OP想要'fielddata.text1'中的數據,這就是EL和路徑表達式所做的事情。 –

+0

好的,我誤解了這個問題。抱歉。 – Pointy

0

吸氣

exports.getDeep = function(field, object){ 
    var parts = field.split('.'); 
    var value = object; 
    // Iterate the parts, updating value each time 
    for(var i = 0; i < parts.length; i++){ 
     value = value[parts[i]]; 
     if(i==parts.length-1){ 
     return JSON.parse(JSON.stringify(value)) 
     } 
    } 
} 

二傳手

exports.setDeep = function(field, object, newvalue){ 
    var parts = field.split('.'); 
    for(var i = 0; i < parts.length; i++){ 
     if(i==parts.length-1){ 
     object[parts[i]] = newvalue 
     return object 
     } 
    } 
} 
+0

該死的安裝員終究不工作,仍然在尋找答案 – coiso

相關問題