Javascript 当第n个嵌套数组没有更多嵌套数组时停止的递归函数
我有一个JSON文档,它有一些嵌套的数组。我想制作Javascript 当第n个嵌套数组没有更多嵌套数组时停止的递归函数,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我有一个JSON文档,它有一些嵌套的数组。我想制作函数AAA(),如果数组有嵌套数组,它每次都会调用。然后在没有更多嵌套数组时停止 比如说。如果我有: array[AAA,BBB,CCC] | AAA[AAA,BBB,CCC] | AAA[AAA,BBB,CCC] |
函数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';
如果(子菜单的类型)!=“未定义”){
导航html+='';
对于(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';
如果(子菜单的类型)!=“未定义”){
导航html+='';
//现在,在这里,不要重复它!
//递归调用函数!
nav_html+=制作列表(子菜单);
导航html+='
';
}
导航html+='';
}
返回导航html;
}
$('#navigation ul').html(makeList(new#json['navigation']);
}
似乎很明显,只要导航不再是属性或空数组,它就应该停止递归。到底是什么问题?您的代码在哪里?请告诉我们您到目前为止有什么,否则我们无法帮助您将条件集成到代码中。正如您在标题中提到的,您需要一个递归函数。那么为什么你的不是递归的呢?