javascript - 递归循环遍历节点树并检查节点是否存在,如果不存在,则使用回调或承诺创建它
问题描述
我想编写一个递归浏览节点树的函数,并根据某个节点是否存在,记录其值或创建丢失的节点。这应该相当简单,但我似乎无法理解它。
我的代码目前看起来像这样:
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;
}
}
}
如果文件夹已经存在,则输出节点 ID 可以正常工作,但现在我希望它在不存在的情况下创建文件夹。我想我需要使用承诺或回调。创建文件夹的代码很简单:
function createFolder() {
chrome.bookmarks.create({
title: appName,
url: null
}, onBookmarkAdded)
}
我将如何以及在何处将其集成到我当前的功能中?(init()
在首次安装应用程序时调用。)
解决方案
似乎您应该能够检查hasFolder
回调中的值并在必要时添加文件夹。像这样的东西:
chrome.bookmarks.getTree(function(itemTree){
itemTree.forEach(function(item){
processNode(item);
if(hasFolder) return;
});
if(!hasFolder){
createFolder();
}
});
我不熟悉 Chrome 的书签 api,所以我不能说它是否会抱怨你在getTree
回调中修改书签集合,但如果不是,这种方法应该可以工作。
另外,附带说明一下,为了提高效率,您可能希望在forEach
找到文件夹后返回,以减少不必要的循环(已在上面的代码中添加)。
function processNode(node) {
// recursively process child nodes
if (node.children) {
node.children.forEach(function(child) {
processNode(child);
if(hasFolder) return;
});
}
if (node.title == folderName) {
console.log(folderName + ' folder already exists: ID is ' + node.id);
hasFolder = true;
folderId = node.id;
}
}
推荐阅读
- java - FirebaseRecyclerAdapter 总是显示空白屏幕
- javascript - 以下代码片段中的最小更改是什么,以使输出为“ABC”?
- c - 如果在函数内部调用 free(),它是否只在本地释放?
- javascript - 尝试使用 moment.js 进行日期验证。错误信息不会显示
- arcore - ARCORE 在 96 吻痕板上
- python - randomSplit 返回 pyspark 中所有零值的数据帧
- typescript - 将枚举打印为字符串打字稿
- python - 图像未出现在 tkinter 窗口和按钮中
- scala - 执行 N 次 Scala Future
- php - 上次登录时间在线的用户条件()