[英]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)
}
為了擺脫null
和undefined
值,我采用了child
數組,濾出了falsy
值(因此,所有false
, undefined
, null
等),然后在每個值上調用recursiveDisplay
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.