boo*_*ode 2 javascript recursion jquery
我有一个像这样的数组:
"pages": [{
"key": "1",
"pages": [{
"key": "2",
"pages": [{
"key": "3"
}]
},
{
"key": "4",
"pages": [{
"key": "5"
}]
}]
}]
Run Code Online (Sandbox Code Playgroud)
其中键1和4处于同一级别,1包含2,其中包含3,键4包含5.我想要的结果是顺序[3,2,5,1,4].我尝试了以下递归,但我无法得到正确的顺序.
function fnGetAll (oTopDetailPage, array) {
var i;
for (i=0; i<oTopDetailPage.length; i++) {
array.push(oTopDetailPage[i]);
if(oTopDetailPage[i].pages) {
fnGetAllSubPages(oTopDetailPage[i].pages, array);
}
}
return array;
}
Run Code Online (Sandbox Code Playgroud)
如果您想要深度优先搜索,您可以先迭代孩子,然后获取实际的密钥.
结果是一个数组,它有点不同,然后是给定的数组.
function getDepthFirst(object) {
var result = [];
object.pages.forEach(function iter(a) {
Array.isArray(a.pages) && a.pages.forEach(iter);
result.push(a.key);
});
return result;
}
var data = { pages: [{ key: 1, pages: [{ key: 2, pages: [{ key: 3 }] }, { key: 4, pages: [{ key: 5 }] }] }] };
console.log(getDepthFirst(data)); // [3, 2, 5, 4, 1]Run Code Online (Sandbox Code Playgroud)
使用临时数组获取反向级别顺序遍历结果的附录[3, 5, 2, 4, 1],该数组从同一级别收集所有数据并返回包含所有级别项目的数组,从最高到最低.
回调在实际级别上使用闭包.
function getData(object) {
var temp = [];
object.pages.forEach(function iter(level) {
return function (a) {
Array.isArray(a.pages) && a.pages.forEach(iter(level + 1));
temp[level] = temp[level] || [];
temp[level].push(a.key);
};
}(0));
return temp.reduceRight(function (r, a) {
return r.concat(a);
});
}
var data = { pages: [{ key: 1, pages: [{ key: 2, pages: [{ key: 3 }] }, { key: 4, pages: [{ key: 5 }] }] }] };
console.log(getData(data)); // [3, 5, 2, 4, 1]Run Code Online (Sandbox Code Playgroud)