2017-05-25 11 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レベルの深さでネストされたオブジェクトを再帰的に検索します。 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. Goは他に
    2. コールfib(1)
    3. 戻り0
    4. コールfib(2)
    5. 返信1
    6. は何もしない次に0 + 1
    7. を追加します。コードは基本的に式(1部分)であり、何もしないelse 1;です。

    returnがないため、最終結果が計算されますが、何もしないと関数は未定義を返します。 返信です。ここでも同じ原則が適用されます。

    +0

    これはうまくいきました。私は今、あなたのフィブスの例で、なぜそれがうまくいくのかを説明します。 – HelloWorld

    +0

    @HelloWorld問題ありません、喜んで助けてください! – Li357

    関連する問題