Javascript 为什么这种递归方法会在IE中出现?使用JSON

Javascript 为什么这种递归方法会在IE中出现?使用JSON,javascript,json,internet-explorer,recursion,Javascript,Json,Internet Explorer,Recursion,在使用以下代码时,它适用于除IE之外的所有浏览器,IE返回一个错误,指出“if(data[item].sub!==null)”行为null或未定义。我特意将JSON对象的sub属性设置为null,以便对此进行测试,并确保有一个值与该“sub”属性关联。所有版本中只有IE中断 createDropDownCode: function(arr){ // loop through li's of primary menu that

在使用以下代码时,它适用于除IE之外的所有浏览器,IE返回一个错误,指出“if(data[item].sub!==null)”行为null或未定义。我特意将JSON对象的sub属性设置为null,以便对此进行测试,并确保有一个值与该“sub”属性关联。所有版本中只有IE中断

            createDropDownCode: function(arr){
            // loop through li's of primary menu
            that.find("li").each(function(idx){

                $(this).append( menusort(arr.menu[idx].sub) );

                $('#PrimNav div.menu').hide();

                function menusort(data){
                    if(data !== null)
                        var html = "<div class='menu'><ul>";    

                    var data_count = 0;

                    for(item in data){

                        data.length-1 == data_count ? html += "<li class='last'>" : html += "<li>";

                        if(data[item].sub !== null){
                            if(typeof(data[item].sub) === 'object'){

                                html += "<a href='" + data[item].link + "'><span>" + data[item].name + "</span></a>";

                                if($.isArray(data[item].sub)){
                                    html += menusort(data[item].sub);
                                }
                            }
                        }

                        html += "</li>"
                        data_count += 1;

                    }

                    if(data !== null)
                        html += "</ul></div>";

                    return html;
                }

在JSON数据中,尝试使用
false
而不是
null
,我认为对象类型比较有点过分

if(data[item].sub) {

    html += "<a href='" + data[item].link + "'><span>" + data[item].name + "</span></a>";

    if($.isArray(data[item].sub)) {
        html += menusort(data[item].sub);
    }
}
if(数据[项目].sub){
html+=“”;
if($.isArray(数据[项目].sub)){
html+=menusort(数据[项].sub);
}
}

编辑:好的,这不是答案。正如我在上面的评论中所说的,请将一个工作(或不工作)示例发布到。

如果(数据===null)返回“”,为什么不写
?这行做什么:data.length-1==数据\计数?html+=“
  • ”:html+=“
  • ”?Fabian,当我使用for…in循环时,我无法访问给定当前项的变量,因此必须包含一个计数器,以便我知道何时处于项循环的末尾,并向该项添加一个类“last”。@quinton我明白了,这是一种非常“黑客”的写入方式。乍一看,我不认为这是一个缩短的if语句。顺便问一下,我的回答对你有帮助吗?我刚刚有了另一个想法,你能给我发一个你的代码的工作示例吗?我找到了答案,非常简单而且很好,虽然IE的响应不是很好。我所需要做的就是确保我用“var”定义了“item”。所以for(数据中的项)变成for(数据中的var项)。此外,我还将在for循环中添加一个hasOwnProperty测试,以确保所有属性都属于该对象。感谢这一想法,但将子属性改为赋值为null,只需将for循环中的项变量设置为“for(数据中的var项)”,而忽略了“var”关键字。
    if(data[item].sub) {
    
        html += "<a href='" + data[item].link + "'><span>" + data[item].name + "</span></a>";
    
        if($.isArray(data[item].sub)) {
            html += menusort(data[item].sub);
        }
    }