2013-10-26 2 views
0

나는이 작은 코드 조각을 사용하여 평면 목록 (정확하게 대상체)에서 계층 구조를 만들려고합니다.Javascript 함수는 undefined를 반환합니다. 이유가 무엇입니까?

AFAIK이 기능은 작동하지만 목록의 마지막 항목에서 작동합니다 findParent 함수는 undefined를 반환합니다. 반환하기 전에 바로 호출하는 console.log가 올바른 값을 제공하더라도. 이걸 일으킬 수있는 어떤 생각?

var fl = [{ 
    "pk": 1, 
     "title": "paul", 
     "parent": 3, 
     "level": 2 
}, { 
    "pk": 2, 
     "title": "ringo", 
     "parent": null, 
     "level": 0 
}, { 
    "pk": 3, 
     "title": "john", 
     "parent": 2, 
     "level": 1 
}]; 

var ho = {}; 
var looplevel = 0; 
var found = 0; 

function findParent (ho,id){ 
    for (i in ho) { 
     ob = ho[i]; 

     if (ob.pk === id) { 
      console.log(ob); 
      return ob; 
     } 
     if (ob.children !== undefined){ 
      findParent(ob.children,id); 
     } 
    } 
} 

while (fl.length != found) { 
    for (var i in fl) { 
     var item = fl[i]; 
     if (item.level === looplevel) { 

      item.children = {}; 
      if (looplevel === 0) { 
       ho[item.pk] = item; 
       console.log("adding " + item.title + " to hl"); 
       found += 1; 
      } else { 
       console.log("adding " + item.title + " to " + item.parent); 
       ww = findParent(ho,item.parent); 
       console.log(ww); 
       ww.children[item.pk] = item; 
       found += 1; 
      } 
      looplevel += 1; 
     } 
    } 
} 
console.log(ho); 

답변

3
function findParent (ho,id){ 
    for (var i in ho) { 
     var ob = ho[i]; 

     if (ob.pk === id) { 
      console.log(ob); 
      return ob; 
     } 
     if (ob.children !== undefined){ 
      var parent = findParent(ob.children,id); 
      if(parent) {//if our recursion found a parent 
       return parent; 
      } 
     } 
    } 
} 

문제는 재귀 값을 반환하지 않을 것입니다. 부모가

업데이트 2 당신의 코드를 다시 읽고 iob 글로벌 될 예정 변수, 나는 내 대답을 정정 너무 일찍 루프를 두지 않는 존재하는 경우

업데이트 볼 필요가 이 변수

관련 문제