2017-05-25 69 views
0

我有,直到它找到一個匹配的文件夾名遞歸遍歷嵌套對象的方法:爲什麼不是我的遞歸函數返回最終結果?

findSpecifiedFolder(data) { 
    const bookmarks = JSON.parse(data).roots.bookmark_bar.children; 
    const search = bookmarks => { 
     for(let folder of bookmarks) { 
      const folderName = folder.name.toLowerCase(); 
      if(folderName === folderArg.toLowerCase()) { 
       console.log(folder); // returns folder object 
       return folder // never returns anything 
      } 
      else if(folder.children) { 
       search(folder.children); 
      } 
     } 
    }; 
    search(bookmarks); 
} 

因此,通過使用console.log和我的調試器,我可以看到以下內容:

  1. 的方法呢,實際上是遞歸搜索給定的對象,嵌套至少3層深。
  2. 我可以證實,我其實是有一個成功的檢查時if(folderName === folderArg.toLowerCase())得到既通過console.log語句並在調試器中的數據

但是執行時,沒有得到執行return語句(確認的調試器),並且該方法返回未定義(或者當我通過另一個錯誤日誌記錄方法調用時發生錯誤)。我不知道爲什麼在這裏,我問是否有人可能會看到我失蹤的方法中的一些錯誤。

回答

2

你必須返回遞歸調用,否則返回值將不會被委派並返回當所有遞歸調用都解決了:

else if(folder.children) { 
    return search(folder.children); 
} 

概念的簡單證明是斐波那契序列。下面是一些僞代碼(不含返程):

function fib(n) { 
    if n is 1 return 0; 
    else if n is 2 return 1; 
    else fib(n - 1) + fib(n - 2); 
} 

所以,如果我叫fib(2),它會經過下面的執行步驟:

  1. 轉到別的
  2. 呼叫fib(1)
  3. 返回0
  4. 致電fib(2)
  5. 返回1
  6. 0 + 1
  7. 然後什麼都不做。代碼基本上是else 1;這是一個表達式(1部分),並且什麼都不做。

由於沒有return,最終的結果是計算出來的,但是你什麼都不做,函數返回undefined。你必須返回吧。這裏適用同樣的原則。

+0

這個工程和你的fib示例我現在得到它的工作原理 - 感謝解釋它! – HelloWorld

+0

@HelloWorld沒問題,樂於幫忙! – Li357