2013-11-20 40 views
0

我可以使用var x = data.file.file查詢我的數據;然而,我有file.file作爲一個字符串和data ['file.file']失敗。有沒有辦法做到這一點,或者我需要分割字符串,並遞歸?如何使用data ['file.file']訪問JSON?

+2

'數據[「文件」] [「文件」]' - 將有兩個步驟來完成與串那樣的,分裂的點。 – Orbling

+0

是的,你需要分割字符串並遞歸地走。解析器已被寫入。 –

回答

1

不訴諸使用eval(你應該避免),你必須拆分字符串。這樣的事情應該很好地工作:

var data = { 
    file: { 
    file: 'YAY' 
    } 
}; 

getProp(data, 'file.file'); // "YAY" 
setProp(data, 'file.newprop.blop', 7); // false 
setProp(data, 'file.newprop', {}); // true 
setProp(data, 'file.newprop.blop', 7); // true 
console.log(data); // {file: {file: "YAY", newprop: {blop: 7}}} 

function getProp(obj, path){ 
    var parts = path.split('.'), u, i; 
    for(i = 0; i < parts.length; i++){ 
    obj = obj[parts[i]]; 
    if(obj === u) return u; 
    } 
    return obj; 
} 

function setProp(obj, path, newValue){ 
    var parts = path.split('.'), u, i; 
    for(i = 0; i < parts.length - 1; i++){ 
    obj = obj[parts[i]]; 
    if(obj === u) return false; 
    } 
    obj[parts[i]] = newValue; 
    return true; 
} 
+0

謝謝(而不是我期待的答案)。 –

+0

順便說一句,我認爲你的代碼是錯誤的。你和我永遠不會被分配。 –

+0

@DavidThielen不,它是正確的,'i'在循環開始時被賦值,'u'被有目的地定義爲'undefined'。 – Paulpro

1

data['file.file']指向名爲'file.file'的數據屬性,而data.file.file指向數據屬性文件的屬性文件。

使用data['file']['file'],而不是實現像data.file.file

更新相同的訪問:

當然,你將不得不分割你的字符串使用多陣列的訪問方法。在你的情況下,這可能是這樣的:

var path = 'file.file' 
var pathElems = path.split('.') 

// access field 
data[pathElems[0]][pathElems[1]]