Javascript 递归地循环遍历节点树并检查节点是否存在,如果不存在,则使用回调或承诺创建它
我想编写一个递归浏览节点树的函数,根据某个节点是否存在,记录其值或创建缺少的节点。这应该是相当简单的,但我似乎不能把我的头围绕它 我的代码当前如下所示:Javascript 递归地循环遍历节点树并检查节点是否存在,如果不存在,则使用回调或承诺创建它,javascript,google-chrome-extension,Javascript,Google Chrome Extension,我想编写一个递归浏览节点树的函数,根据某个节点是否存在,记录其值或创建缺少的节点。这应该是相当简单的,但我似乎不能把我的头围绕它 我的代码当前如下所示: let folderName = 'My Folder Name'; function init() { let hasFolder = false; let folderId = ''; chrome.bookmarks.getTree(function(itemTree){ itemTree.forEach(func
let folderName = 'My Folder Name';
function init() {
let hasFolder = false;
let folderId = '';
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
});
});
function processNode(node) {
// recursively process child nodes
if (node.children) {
node.children.forEach(function(child) {
processNode(child);
});
}
if (node.title == folderName) {
console.log(folderName + ' folder already exists: ID is ' + node.id);
hasFolder = true;
folderId = node.id;
}
}
}
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
if(hasFolder) return;
});
if(!hasFolder){
createFolder();
}
});
如果文件夹已经存在,那么输出节点ID就可以了,但是如果文件夹不存在,现在我希望它创建文件夹。我想我需要用承诺或回电。创建文件夹的代码很简单:
function createFolder() {
chrome.bookmarks.create({
title: appName,
url: null
}, onBookmarkAdded)
}
我将如何以及在何处将其整合到我当前的职能中?
(
init()
在第一次安装应用程序时被调用。)看起来您应该能够在回调中检查hasFolder
的值,并在必要时添加文件夹。大概是这样的:
let folderName = 'My Folder Name';
function init() {
let hasFolder = false;
let folderId = '';
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
});
});
function processNode(node) {
// recursively process child nodes
if (node.children) {
node.children.forEach(function(child) {
processNode(child);
});
}
if (node.title == folderName) {
console.log(folderName + ' folder already exists: ID is ' + node.id);
hasFolder = true;
folderId = node.id;
}
}
}
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
if(hasFolder) return;
});
if(!hasFolder){
createFolder();
}
});
我不熟悉Chrome的bookmarks api,所以我不能说它是否会抱怨您修改getTree
回调中的bookmarks集合,但如果不是,这种方法应该有效
另外,为了提高效率,您可能希望在找到文件夹后返回forEach
,以减少不必要的循环(已在上述代码中添加)
}您希望在何处添加节点?如果节点在树中不存在,您是只添加一次节点,还是在它不存在的每个级别都添加一次节点?@BrianS如果节点在任何地方都不存在,我只想在第一个级别将其添加一次到树中。当使用
break
时,它会说“SyntaxError:非法break语句”-将break
替换为return
似乎有效…哦,对不起,break在foreach
中无效,仅在标准循环中有效。我将修改答案,改为使用return。