2014-03-02 61 views
1

我正在嘗試編寫代碼來讀取嵌套的JSON並打印項目。後來我打算從這裏生成一個菜單。Javascript遞歸函數不工作

的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" 
        } 
     } 
    ] 
} 

我使用以下遞歸函數:

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被評估的JSON對象使用JSON.parse(XHR.responseText)其中XHR是開始用於檢索數據的對象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.2Menu 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