2014-03-02 3 views
1

중첩 된 JSON을 읽고 항목을 인쇄하는 코드를 작성하려고합니다. 나중에이 메뉴를 생성 할 계획입니다.자바 재귀 함수가 작동하지 않습니다.

function menuize(m) { 
    if (m instanceof Array) { 
     for(i = 0; i < m.length; i++) { 
      for(p in m[i]) { 
       menuize(m[i][p]); 
      } 
     }   
    } else if (m instanceof Object) { 
     for(p in m) { 
       menuize (m[p]);     
     } 

    } else { 
     console.log('Label: ' + m); 
    } 

} 

menuize(m) 호출 m는 XHR은을이다 JSON.parse(XHR.responseText)를 사용하여 평가 된 JSON 객체 인 시작 : 나는 다음과 같은 재귀 함수를 사용하고

{ 
    "label": "Root of Menu", 
    "child": [ 
      { 
      "label": "Menu 1", 
      "child": [ 
        { 
        "label": "Menu 1.1", 
        "child": [ 
          { 
           "label": "Menu 1.1.1" 
          }, 
          { 
           "label": "Menu 1.1.2" 
          } 
        ] 
       }, 
       { 
        "label": "Menu 1.2", 
        "child": [ 
          { 
           "label": "Menu 1.2.1" 
          }, 
          { 
           "label": "Menu 1.2.2" 
          } 
        ] 
       }, 
       { 
        "label": "Menu 1.3", 
        "child": [ 
          { 
           "label": "Menu 1.3.1" 
          }, 
          { 
           "label": "Menu 1.3.2" 
          } 
        ] 
       } 
      ] 
     }, 
     { 
      "label": "Menu 2", 
      "child": [ 
        { 
         "label": "Menu 2.1" 
        }, 
        { 
         "label": "Menu 2.2" 
        } 
      ] 
     }, 
     { 
      "label": "Menu 3", 
      "child": 
        { 
         "label": "Menu 3.1" 
        } 
     } 
    ] 
} 

을 다음과 같이

json으로 콘텐츠입니다 XMLHttpRequest 오브젝트를 사용하여 데이터를 검색합니다. 데이터가 완전히 잘 읽혀서 문제가되지 않는 것을 보았습니다.

이제 함수는 다소 정확합니다. 가장 안쪽에있는 child에 도달 할 때까지 제대로 작동하지만 그 후에는 나머지 항목을 한 레벨 위로 제대로 인쇄하지 못합니다. 에.

당신이 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다 생성 된 출력 : 및

t: Root of Menu 
t: Menu 1 
t: Menu 1.1 
t: Menu 1.1.1 
t: Menu 1.1.2 

나는 정확히 무슨 일이 일어나고 있는지 이해할 수 없다 왜해야하지 항목 상단에 상대적입니다 Menu 1.2, Menu 2 (같은 레벨)을 인쇄하십시오.

누군가 통찰력을 제공하고 이해하도록 도와 주시겠습니까? 감사합니다.

답변

3

반복 변수는 var으로 선언해야 로컬 변수가됩니다. 그렇지 않으면 다시 호출 할 때 호출자에서 사용 된 변수를 덮어 쓰게됩니다.

function menuize(m) { 
    var i, p; 
    if (m instanceof Array) { 
     for(i = 0; i < m.length; i++) { 
      for(p in m[i]) { 
       menuize(m[i][p]); 
      } 
     }   
    } else if (m instanceof Object) { 
     for(p in m) { 
       menuize (m[p]);     
     } 

    } else { 
     console.log('Label: ' + m); 
    } 

} 
+0

대단히 감사합니다. 그것은 작동합니다! 내가 그것을 놓쳤다라고 생각할 수 없다! – abhishekcghosh

관련 문제