簡體   English   中英

如何遍歷javascript對象中的所有子文檔?

[英]How to traverse through all subdocuments in a javascript object?

我想遍歷javascript對象中的所有子文檔,而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);

預期結果:abcdefghijk,
實際結果:abcdefgh

遞歸函數存在兩個問題:迭代器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]);
        }
    }
}

這就是我要做的:

function recursiveDisplay(doc) {
  console.log(doc.name + " ")
  doc.child.filter(Boolean).forEach(rec)
}

為了擺脫nullundefined值,我采用了child數組,濾出了falsy值(因此,所有falseundefinednull等),然后在每個值上調用recursiveDisplay

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM