如何遍历javascript对象中的所有子文档?

时间:2019-09-01 10:09:02

标签: javascript recursion

我想遍历一个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

2 个答案:

答案 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)
}

为了摆脱nullundefined的值,我采用child数组,过滤掉falsy的值(所以任何falseundefinednull等),然后分别对它们调用recursiveDisplay