Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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 当第n个嵌套数组没有更多嵌套数组时停止的递归函数_Javascript_Jquery_Ajax_Json - Fatal编程技术网

Javascript 当第n个嵌套数组没有更多嵌套数组时停止的递归函数

Javascript 当第n个嵌套数组没有更多嵌套数组时停止的递归函数,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我有一个JSON文档,它有一些嵌套的数组。我想制作函数AAA(),如果数组有嵌套数组,它每次都会调用。然后在没有更多嵌套数组时停止 比如说。如果我有: array[AAA,BBB,CCC] | AAA[AAA,BBB,CCC] | AAA[AAA,BBB,CCC] |

我有一个JSON文档,它有一些嵌套的数组。我想制作
函数AAA()
,如果数组有嵌套数组,它每次都会调用。然后在没有更多嵌套数组时停止

比如说。如果我有:

         array[AAA,BBB,CCC]
                |
               AAA[AAA,BBB,CCC]
                    |
                   AAA[AAA,BBB,CCC]
                        |
                       etc.
AAA
有子数组时,我想总是调用
函数AAA()。假设
AAA
有5次
subAAA
。我希望
函数(AAA)
调用自身5次,然后停止。如果将来我添加更多的子数组来调用更多次

如果有帮助,这里是我的
.json

{
    "navigation" : [

        {
            "name" : "home",
            "href" : "home.html"    
        },

        {
            "name" : "services",
            "href" : "interior.html",
            "navigation" : [
                {
                    "name" : "PROJECT MANAGEMENT",
                    "href" : "interior.html",
                    "navigation" : [
                            {
                                "name" : "PROJECT MANAGEMENT",
                                "href" : "interior.html"
                            },
                            {
                                "name" : "BUSINESS ANALYST",
                                "href" : "interior.html"
                            }
                        ]
                },
                {
                    "name" : "BUSINESS ANALYST",
                    "href" : "interior.html"
                }
            ]
        },

        {
            "name" : "company",
            "href" : "home.html"    
        }


    ]
}
js代码是:

function parseJSON(){

        var navigation = new_json['navigation'];
        var nav_html = '';

        for (var i = 0; i < navigation.length; i++) {

            var name = navigation[i]['name'];
            var href = navigation[i]['href'];
            var submenu = navigation[i]['navigation'];

            nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

            if( typeof(submenu) != 'undefined' ){
                nav_html += '<ul>';

                for( var j=0; j<submenu.length; j++ ){

                    var submenu_name = submenu[j]['name'];
                    var submenu_href = submenu[j]['href'];

                    nav_html += '<li><a href="' + submenu_href + '">' + submenu_name + '</a></li>';         
                }
                nav_html += '</ul>';
            }
            nav_html += '</li>';
            console.log( nav_html );
            $('#navigation ul').html( nav_html );
        };  
    };
函数parseJSON(){
var navigation=new_json['navigation'];
var nav_html='';
对于(变量i=0;i对于(var j=0;j如果我认为它只需要在包含导航属性时再次运行,那么您可以使用:

// Without using Array.forEach. Array.isArray polyfill may be 
// required to support older browsers.
function getLinks(obj) {
    var i, len;
    if (Array.isArray(obj.navigation)) {
        len = obj.navigation.length;
        for (i = 0; i < len; i += 1) {
            getLinks(obj.navigation[i]);
        }
    }
}

// Using Array.forEach - Polyfill may be required using the 
// forEach method to support older browsers.
function getLinks(obj) {
    if (Array.isArray(obj.navigation)) {
        obj.navigation.forEach(function (link) {
            getLinks(link);
        });
    }
}

// Array.isArray polyfill.
if(!Array.isArray) {
    Array.isArray = function (vArg) {
        return Object.prototype.toString.call(vArg) === "[object Array]";
    };
}

// Array.forEach polyfill.
if (!Array.prototype.forEach) {
    Array.prototype.forEach = function(fn, scope) {
        for(var i = 0, len = this.length; i < len; ++i) {
            fn.call(scope, this[i], i, this);
        }
    }
}
//在不使用Array.forEach.Array.isArray的情况下,polyfill可能是
//需要支持较旧的浏览器。
函数getLinks(obj){
变量i,len;
if(数组isArray(对象导航)){
len=obj.navigation.length;
对于(i=0;i


递归函数的构建非常简单,与您已有的代码非常相似:

function parseJSON() {
    function makeList(navigation) {
        var nav_html = '';
        for (var i = 0; i < navigation.length; i++) {
            var name = navigation[i]['name'],
                href = navigation[i]['href'],
                submenu = navigation[i]['navigation'];

            nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

            if( typeof(submenu) != 'undefined' ){
                nav_html += '<ul>';
                // now here, do not iterate it again!
                // call the function recursively!
                nav_html += makeList(submenu);
                nav_html += '</ul>';
            }
            nav_html += '</li>';
        }
        return nav_html;
    }
    $('#navigation ul').html( makeList( new_json['navigation'] ) );
}
函数parseJSON(){
函数生成列表(导航){
var nav_html='';
对于(变量i=0;i
似乎很明显,只要
导航不再是属性或空数组,它就应该停止递归。到底是什么问题?您的代码在哪里?请告诉我们您到目前为止有什么,否则我们无法帮助您将条件集成到代码中。正如您在标题中提到的,您需要一个递归函数。那么为什么你的不是递归的呢?