2012-09-27 136 views
1

我试图遍历书签树(分类到文件夹和子文件夹),并使用它们的“路径”为每个文件夹创建标签列表。 - 存储在“开发”>“JS”>“博客”书签将有标签映射为['Dev, 'JS, 'Blogs']递归/嵌套函数 - 参数范围

使用chrome.bookmarks.getTree结构的Chrome浏览器的默认之一,它看起来像这样:

[{ 
    'title' : '', 
    children : [{ 
      'title' : 'a title', 
      'url' : 'http://www.example.com' 
     }, 
     { 
      'title' : 'a folder category', 
      'children' : [{...}] 
     }, 
    }] 
}]; 

。 ..和我的代码是:

function processTreeNodes(tree, tags) { 
    console.log(tags); 
    var t = tags || []; 
    for (var i=0; i < tree.length; i++) { 
     processNode(tree[i], t); 
    } 
} 


function processNode(n, tags) { 
    if(n.children) { 
     tags.push(n.title); 
     //It's a group, loop over it 
     processTreeNodes(n.children, tags); 
    } else { 
     //Do something with the bookmark 
    } 
} 

chrome.bookmarks.get(function(bmTree) { 
    processTreeNodes(bmTree); 
}); 

什么,我期望是为console.log显示

[ 'category1', 'subcat1', ...] 

然后

['category2, 'subcatA', ...] 

由我结束而终止得到的是

['category1, 'subcat1', ..., 'category2', 'subcatA', ...] 

它经历和拉所有的信息,但是在我看来,当我退后一步了堆叠的'水平'的参数还没有被保存..我认为这可能是与递归/闭包,但我失去了!

对不起,如果这没有意义,我正在努力让我的头像它,让我知道,我可以尝试进一步解释,如果有必要!

+0

什么是'arg'变量? – alnorth29

+0

@ alnorth29错误!我现在编辑它,哎呀! – Paul

回答

2

看起来你只是创建一个数组,然后传递给你所有的递归子函数。我会留下来编写代码,但看起来您需要在层次结构中的每个点克隆您的数组,以便您将引用传递给新的对象,而不是始终传递相同的引用。

+0

谢谢,就是这样,我现在排序! – Paul