2014-03-07 42 views
3

獲取的值是否有辦法讓給予鍵順序的一個字符串路徑JSON

{ 
    "first": "first-string", 
    "second-array": [ 
     { 
      "first-Obj": 2 
     } 
    ] 
} 

值是有一種方式來獲得,或通過使用像串的路徑更新值

ex: to change the first-obj's value to 1000 
    changeTheValueAt('second-array/0/firstObj', 1000) 

是否有像上面那樣的任何函數changeTheValueAt或方法。

+0

你的意思是更新服務器上的值?或只在本地? – Kyo

+0

這是關於本地更新。 – ddarz4u

回答

5

使用下面的函數,該函數 -

function changeTheValueAt(obj, path, value) { 
    var parts = path.split("/"), 
     final = obj[parts[0]], 
     i; 

    for (i = 1; i < parts.length; i++) { 
     if (i + 1 < parts.length) { 
      final = final[parts[i]]; 
     } 
     else { 
      final[parts[i]] = value; 
     } 
    } 
} 

,然後調用它像這樣 -

var ob = { 
    "first": "first-string", 
    "second-array": [ 
     { 
      "first-Obj": 2 
     } 
    ] 
}; 

changeTheValueAt(ob, "second-array/0/first-Obj", 1000) 

alert(ob["second-array"][0]["first-Obj"]); 

JSFiddle Demo

-3

因爲second-array是一個數組,所以不能按名稱訪問它。你可以通過索引來訪問它,或者你可以遍歷並找到一個值並在找到時進行更改。

var yourObj = { 
    "first": "first-string", 
    "second-array": [ 
     { 
     "first-Obj": 2 
     } 
    ] 
}; 

yourObject.second-array[0].first-Obj = 1000; 

你可以這樣做:

var changeFirstObj = function(node1, node2, new val){ 
    yourObj[node1].forEach(o, i){ 
    for(var prop in o){ 
     if(prop == node2){ 
      o[node2]=newVal; 
     } 
    }; 

    changeFirstObj('second-array', 'first-Obj', 1000); 

但是,這不是真的很靈活。

+0

包含'-'的屬性名稱不是標識符,因此您無法使用點標記來訪問它們,您必須使用括號。 '[ 「第一目標文件」]'。 – Barmar