2014-10-03 48 views
1

這可能更多的是一個建議/最佳實踐問題,但我想知道什麼最平滑/最優雅/可讀的方式來循環一個非常大的JSON數組。通過使用jQuery對維度JSON數組進行迭代

這裏是一個數組的例子。請注意,有時數組大小是不同的(因爲它是一個數據庫查詢)。

{ 
"1": 
    { 
    "attributes": 
    {"Label" : "Some Label"}, 
    "leader": 
    {"123" : 
     {"Name" : "Joe", 
     "Age" : "50"} 
    } 
} 
}, 
"2" 
    {"attributes": 
    {"Label" : "Some label"}, 
    "leader": 
    {"456" : 
     {"Name" : "Bob", 
     "Age" : "24", 
     "followers" : 
      {"243" : 
      {"Name" : Jimmy"} 

...etc 

在英語在這個例子中,你可能會得到有可能有可能遇到的問題可能有合同...等職工關注領導者的組織名單。

其實我已經有沒有問題通過使用這樣的結構,通過這種結構的迭代(因爲我的確知道肯定最深層次的是什麼):

$.each(data, function(i, Org){ 
    var org = i; 
    $.each(org, function (i, leader){ 
    $.each(leader, function (i, follower){ 
    .....etc 
    } 
} 
} 

是國內唯一方法來通過嵌套$ .each循環的多昏暗的數組,或者有更好的乾淨的方式來實現這一點,即遞歸數組(這將以某種方式知道要移回索引並挖掘該數組,直到沒有任何東西離開,移回來等)

+1

使用遞歸函數通過遞歸數據結構進行迭代。 – Barmar 2014-10-03 20:10:36

+0

答案確實取決於您的預期用途。您是否需要遍歷葉節點,還是需要知道節點路徑中的值?你是在將東西移動到新的數據結構中,還是在閱讀它們時在葉節點上運行? – nrabinowitz 2014-10-03 20:11:51

+0

您可能會對Protovis庫中提供的Flatten操作符感興趣:https://github.com/mbostock/protovis/blob/master/src/data/Flatten.js – nrabinowitz 2014-10-03 20:13:40

回答

2

這是一個遞歸函數,我有時候寫了回那個pa RSES陣列 -

function arrayParse(currentObject, key) { 
    for (var property in currentObject) { 
     if (typeof currentObject[property] === "object") { 
      arrayParse(currentObject[property], property); 
     } else { 
      $('#result').append(
       (property=='value' && key ? key : property) 
       + ' -- ' + currentObject[property] + '<br />' 
      ); 
     } 
    } 
} 

與樣品陣列固定的問題後,我得到以下輸出 -

Label -- Some Label 
Name -- Joe 
Age -- 50 
Label -- Some label 
Name -- Bob 
Age -- 24 
Name -- Jimmy 
Age -- 40 

下面是一個example

+0

我不明白一件事:當它發現currentObject不是一個對象,並追加它,它不會開始向後追加東西嗎? IE會在父代之前追加最後一個孩子? – tdoakiiii 2014-10-03 21:04:54

+0

將地點項目附加爲容器中的'最後'項目。預先考慮會改變訂單。 – 2014-10-03 21:07:08

+0

但是你首先追加最深的元素,不是嗎?你要說的是深入底部,直到沒有任何東西可以迭代,然後追加它。這意味着最深的元素會附加在父代之前 – tdoakiiii 2014-10-03 21:28:19