2014-03-02 65 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