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。