为什么我的递归函数没有返回最终结果?

时间:2017-05-25 05:49:34

标签: javascript node.js object

我有一个方法,它以递归方式遍历嵌套对象,直到找到匹配的文件夹名称:

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())语句和调试器中的数据
  3. 执行console.log时,我确实成功检查了

    但是,return语句没有被执行(用调试器确认),并且该方法返回undefined(或者当我通过另一个带有错误记录的方法调用时出错)。我不知道为什么会这样,我在问我是否有人会在我失踪的方法中看到一些错误。

1 个答案:

答案 0 :(得分:2)

您必须返回递归调用,否则在解析所有递归调用时,不会委派和返回返回的值:

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

一个简单的概念证明就是Fibonacci序列。这是一些伪代码(不返回):

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部分)并且什么都不做。
  8. 由于没有return,因此计算出最终结果,但是对它没有任何作用,函数返回undefined。你必须返回它。同样的原则适用于此。