2012-12-19 109 views
3

我有一個多維數組,但ID在父母和孩子中是唯一的,所以我通過使用for循環來循環使用問題。問題是我似乎無法抓住孩子的ID。你認爲我應該如何處理?通過具有所有唯一ID的多維數組遍歷多個數組

var Options = [ 
      { 
       id: 0, 
       children: [] 
      }, 
      { 
       id: 2, 
       children: [] 
      }, 
      { 
       id: 3, 
       children: [ 
        { 
         id: 4, 
         children: [] 
        }, 
        { 
         id: 5, 
         children: [] 
        }, 
        { 
         id: 6, 
         children: [] 
        } 
       ] 
      }, 
      { 
       id: 7, 
       children: [ 
        { 
         id: 8, 
         children: [] 
        }, 
        { 
         id: 9, 
         children: [] 
        } 
        ] 
      } 
     ]; 

我一直代碼簡潔爲簡潔起見。我想要做的是遍歷數組來比較ID的。

+0

只是純粹的JavaScript?沒有圖書館? – qooplmao

+2

你是什麼意思你有問題循環?你需要解釋你的問題是什麼。 – epascarello

回答

5

這看起來並不像一個 「多維數組」,而是像一棵樹。

for (var i=0; i<Options.length; i++) // do something 

要循環樹順序,你將需要一個遞歸函數:循環一層可以用for循環的簡單做

function loop (children, callback) { 
    for (var i=0; i<children.length; i++) { 
     callback(children[i]); 
     loop(children[i].children, callback); 
    } 
} 
loop(Options, console.log); 

要通過自己的ID得到所有的孩子,這樣就可以通過IDS(無論樹形結構)的循環,可使用查找表:

var nodesById = {}; 
loop(Options, function(node) { 
    nodesById[node.id] = node; 
}); 
// access: 
nodesById[4]; 

...和循環他們通過ID進行排序,你現在可以做

Object.keys(nodesById).sort(function(a,b){return a-b;}).forEach(function(id) { 
    var node = nodesById[id]; 
    // do something 
}); 
2

遞歸怎麼樣?

var findById = function (arr, id) { 
    var i, l, c; 
    for (i = 0, l = arr.length; i < l; i++) { 
     if (arr[i].id === id) { 
      return arr[i]; 
     } 
     else { 
      c = findById(arr[i].children, id); 
      if (c !== null) { 
       return c; 
      } 
     } 
    } 
    return null; 
} 

findById(Options, 8); 
2

啊,使用遞歸:d

var Options = "defined above";//[] 
var OptionArray = []; //just as an example (not sure what you want to do after looping) 
(function looper(start){ 
for(var i = 0, len = start.length; i < len; i++){ 
    var currentOption = start[i]; 
    if(currentOption.id > 3){//could be more complex 
    OptionArray.push(currentOption); 
    } 
    if(currentOption.children.length > 0){ 
    looper(currentOption.children); 
    } 
} 
})(Options);