我想遍历一个javascript对象中的所有子文档,该对象可能在数组child内有多个子对象,但是当我递归执行时会崩溃。
仅当我退出2个或更多递归时才会发生,它会同时退出整个操作。如果对象只有一个孩子,则效果很好。一个对象可以有多个子代。子代数的任何不规则模式都会破坏递归。 我在node和firefox中尝试过,但是结果相同。
foo={name:"a",child:[
{name:"b",child:[
{name:"c",child:[
{name:"d",child:[
{name:"e",child:[]},
{name:"f",child:[
{name:"g",child:[
{name:"h",child:[]}
]}
]}/*recursion crashes here*/,
{name:"i",child:[]}
]},
{name:"j",child:[
{name:"k",child:[null]}
]}
]}
]}
]};
function recursiveDisplay(doc){
process.stdout.write(doc.name+" ");
for(i=0;i<doc.child.length;i++){
recursiveDisplay(doc.child[i]);
}
}
recursiveDisplay(foo);
预期结果:a b c d e f g h i j k,
实际结果:a b c d e f g h
答案 0 :(得分:0)
递归函数有两个问题:迭代器i
是一个全局变量,因此递归调用将覆盖该值,从而导致您看到较早的退出。可以通过使用带有let i=0
的本地迭代器来解决此问题。
第二,没有null
的检查,当您到达"k"
时会引起问题。以下应同时解决这两个问题:
function recursiveDisplay(doc){
process.stdout.write(doc.name+" ");
for(let i=0;i<doc.child.length;i++){
if (doc.child[i]){
recursiveDisplay(doc.child[i]);
}
}
}
答案 1 :(得分:0)
这就是我要做的:
function recursiveDisplay(doc) {
console.log(doc.name + " ")
doc.child.filter(Boolean).forEach(rec)
}
为了摆脱null
和undefined
的值,我采用child
数组,过滤掉falsy
的值(所以任何false
,undefined
,null
等),然后分别对它们调用recursiveDisplay
。