Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用递归对多级JSON进行排序和解析_Javascript_Jquery_Json_Recursion - Fatal编程技术网

Javascript 使用递归对多级JSON进行排序和解析

Javascript 使用递归对多级JSON进行排序和解析,javascript,jquery,json,recursion,Javascript,Jquery,Json,Recursion,这是我第一次尝试在javascript中使用递归,我需要一些帮助来理解它 我有这个JSON,它有多个级别的子类别 var STORE_CATEGORIES = [{ "Id":"1", "Name":"One Parent", "Sort":"0", "Subcategories":[ "Id":"1", "Name":"One Subcategory",

这是我第一次尝试在javascript中使用递归,我需要一些帮助来理解它

我有这个JSON,它有多个级别的子类别

    var STORE_CATEGORIES = [{
        "Id":"1",
        "Name":"One Parent",
        "Sort":"0",
        "Subcategories":[
            "Id":"1",
            "Name":"One Subcategory",
            "Sort":"0",
            "Subcategories":[{
                "Id":"1",
                "Name":"One SubSubcategory",
                "Sort":"0",
                "Subcategories":[{
                     .....
                }]
            }]
        ]},
        "Id":"2",
        "Name":"Two Parent",
        "Sort":"1",
        ....
    ]}
这是我到目前为止的剧本:

function sortJSON(json, output, prop, asc){
    json = json.sort(function(a, b){
        if(asc){
            return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
        } else {
            return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
        }
    });
    showJsonResults(json, output);
}
function showJsonResults(json, output){
    var parent = output;
    var list = $('<ul />').appendTo(parent);
    var html = '';
    for (var i = 0; i < json.length; i++) {
        var result = json[i];
        html += '<li data-sort="'+result.Sort+'" data-id="'+result.Id+'"';
        if(result.Visible == false){
            html += ' class="hide"';
        }
        html += '><a href="'+result.URL+'">'+result.Name+'</a>';
        if(result.Subcategories){
            html += '<ul>';
            for (key in result.Subcategories) {
                var sub = result.Subcategories[key];
                html += '<li data-sort="'+sub.Sort+'" data-id="'+sub.Id+'"';
                if(sub.Visible == false){
                    html += ' class="hide"';
                }
                html += '><a href="'+sub.URL+'">'+sub.Name+'</a>';
                html += '</li>';
            }
            html += '</ul>';
        }
        html += '</li>';
    }
    list.append(html);
}
现在我只得到了类别+子类别,但是子类别中有更多的子类别

这里如何使用递归?
谢谢。

您需要稍微更改您的功能:

    function sortJSON(json, output, prop, asc){
        json = json.sort(function(a, b){
            if(asc){
                return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
            } else {
                return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
            }
        });
        var parent = output;
        var list = $('<ul />').appendTo(parent);
        var html = showJsonResults(json);
        list.append(html);
    }
function showJsonResults(json) {
   var html = '';
   $.each(json, function(i, result) {
     html += '<li data-sort="' + result.Sort + '" data-id="' + result.Id + '"';
     if (result.Visible == false) {
       html += ' class="hide"';
     }
     html += '><a href="' + result.URL + '">' + result.Name + '</a>';
     if (result.Subcategories.length) { //if you have subcategories call the function again
       console.log(result.Subcategories[0].Name);
       html += '<ul>' + showJsonResults(result.Subcategories) + '</ul>';
     }

     html += '</li>';
   });
   return html
 }
}

演示:

您的目标是什么?需要使用递归来获取所有子类别,而不仅仅是第一个类别。还需要显示子类别的子类别。不起作用,我认为整个函数需要以某种方式重写,不需要其他子类别。。有或没有,如果是相同的结果,你能看看这里吗?仍然没有得到第三级的分类给我一个第三级的条目AAA我的错,对不起-json坏了,谢谢你的回答!
    function sortJSON(json, output, prop, asc){
        json = json.sort(function(a, b){
            if(asc){
                return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
            } else {
                return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
            }
        });
        var parent = output;
        var list = $('<ul />').appendTo(parent);
        var html = showJsonResults(json);
        list.append(html);
    }
function showJsonResults(json) {
   var html = '';
   $.each(json, function(i, result) {
     html += '<li data-sort="' + result.Sort + '" data-id="' + result.Id + '"';
     if (result.Visible == false) {
       html += ' class="hide"';
     }
     html += '><a href="' + result.URL + '">' + result.Name + '</a>';
     if (result.Subcategories.length) { //if you have subcategories call the function again
       console.log(result.Subcategories[0].Name);
       html += '<ul>' + showJsonResults(result.Subcategories) + '</ul>';
     }

     html += '</li>';
   });
   return html
 }
}