递归/嵌套函数 - 参数范围

时间:2012-09-27 14:41:57

标签: javascript recursion google-chrome-extension

我正在尝试遍历书签树(已分类到文件夹和子文件夹中),并使用其“路径”为每个文件夹创建标记列表,例如 - 存储在'Dev'>中的书签'JS'> “博客”会将标记映射为['Dev, 'JS, 'Blogs']

结构的Chrome默认使用chrome.bookmarks.getTree,如下所示:

[{
    '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', ...]

它通过并拉出所有信息,但在我看来,当我退回堆栈时,该'级别'的参数尚未保存..我认为它可能与递归有关/关闭或许,但我迷路了!

对不起,如果这没有意义,我很难理解它,请告诉我,如果有必要,我可以尝试进一步解释!

1 个答案:

答案 0 :(得分:2)

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