2012-12-19 5 views
3

나는 다차원 배열을 가지고 있지만 ID는 부모와 자식간에 고유하므로 for 루프를 사용하여 루프를 반복하는 데 문제가 있습니다. 문제는 아이들의 신분을 파악할 수 없다는 것입니다. 내가 어떻게 처리해야한다고 생각하니?모든 고유 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

그냥 순수한 자바 스크립트? 라이브러리가 없습니까? – qooplmao

+2

문제가 반복된다는 것은 무엇을 의미합니까? 문제가 무엇인지 설명해야합니다. – epascarello

답변

5

이것은 "다차원 배열"처럼, 오히려 나무처럼하지 않습니다.

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

루프에 나무가에서 주문, 당신은 재귀 함수가 필요합니다 : 한 레벨 루핑을위한 루프 간단하게 수행 할 수 있습니다

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를 통해 루프, 룩업 테이블을 사용할 수 있도록 : 그들이 ID로 분류

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

... 루프에를, 당신은 지금

을 수행 할 수 있습니다 0
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);