我有一个方法,它以递归方式遍历嵌套对象,直到找到匹配的文件夹名称:
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
和我的调试器,我可以看到以下内容:
if(folderName === folderArg.toLowerCase())
语句和调试器中的数据console.log
时,我确实成功检查了
醇>
但是,return语句没有被执行(用调试器确认),并且该方法返回undefined(或者当我通过另一个带有错误记录的方法调用时出错)。我不知道为什么会这样,我在问我是否有人会在我失踪的方法中看到一些错误。
答案 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)
,它将执行以下执行步骤:
fib(1)
fib(2)
0 + 1
else 1;
,它是一个表达式(1
部分)并且什么都不做。由于没有return
,因此计算出最终结果,但是对它没有任何作用,函数返回undefined。你必须返回它。同样的原则适用于此。