我是一名Javascript新手撰写Chrome扩展程序。我想在特定文件夹中获取一组书签。我复制了一些爬行文件夹和书签树的代码,但是当我修改它以返回文件夹的内容时,它只抓取树的一部分。
它使用Chrome书签API。每个节点都有一个标题,URL和一个子节点数组。 http://developer.chrome.com/extensions/bookmarks.html#type-BookmarkTreeNode
function findFolder(bookmarkNodes, folderName) {
for(var i=0;i<bookmarkNodes.length;i++) {
console.log(bookmarkNodes[i].title, bookmarkNodes[i].url ?
bookmarkNodes[i].url : "[Folder]");
/* (A) this crawls the whole tree successfully
if(bookmarkTreeNodes[i].children) {
traverseBookmarks(bookmarkTreeNodes[i].children);
}
*/
// (B) this stops at the first terminal branch
if(bookmarkNodes[i].children) {
if (bookmarkNodes[i].title == folderName) {
return bookmarkNodes[i].children;
}
return findFolder(bookmarkNodes[i].children);
}
}
}
运行注释代码(A)时,控制台输出显示所有文件夹和书签。当代码B运行时,它只会到第一个没有子节点的分支,并且不处理兄弟分支或父节点的兄弟节点。控制台显示该分支的文件夹名称及其中的所有书签。
范围问题似乎是递归函数问题的根源,但我尝试过将函数变为变量(我真的不明白它的作用),并添加变量来存储每个函数中的书签数组函数的迭代,没有任何区别。
当找到指定的文件夹时,如何让它返回子书签数组?
答案 0 :(得分:0)
我使用了递归函数范围之外的局部变量:
function findFolder(bookmarkNodes, folderName) {
var bookmarks;
function crawlFolders(bmn) {
for(var i=0;i<bmn.length;i++) {
console.log(bmn[i].title, bmn[i].url ? bmn[i].url : "[Folder]");
if (bookmarks)
return;
if(bmn[i].children) {
if (bmn[i].title == folderName) {
bookmarks = bmn[i].children;
return;
} else {
crawlFolders(bmn[i].children);
}
}
}
}
crawlFolders(bookmarkNodes);
return bookmarks;
}