Javascript创建变量深度的分层列表

时间:2015-02-13 19:17:59

标签: javascript jquery recursion

我有一个类别列表,每个类别都有一个children类别数组,这些类别本身可以包含children。我正在尝试创建一个类别列表,每个类别还包含一个子列表。

我的HTML只是顶级列表的容器:

<ul id="categories"></ul>

然后我有以下Javascript:

function addCategories($list, cats) {
        $.each(cats, function(i, cat) {
                $item = $('<li><a href="#">' + cat.name + '</a></li>');

                if(cat.children.length) {
                        $subList = $('<ul></ul>');
                        $item.append($subList);
                        addCategories($subList, cat.children);
                }

                $list.append($item);
        });
}

var categories = [
    {
        "name": "Category 1",
        "children": []
    },
    {
        "name": "Category 2",
        "children": [
            {
                "name": "Subcategory 2",
                "children": [
                    {
                        "name": "Subsubcategory 2",
                        "children": []
                    }
                 ]
            }
         ]
    },
    {
        "name": "Category 3",
        "children":[]
    }
];

$(function() {
   addCategories($('#categories'), categories); 
});

我希望看到的是:

<ul id="categories">
    <li>
        <a href="#">Category 1</a>
    </li>
    <li>
        <a href="#">Category 2</a>
        <ul>
            <li>
                <a href="#">Subcategory 2</a>
                <ul>
                    <li>
                        <a href="#">Subsubcategory 2</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        <a href="#">Category 3</a>
    </li>
</ul>

然而,相反,我看到了:

<ul id="categories">
    <li>
        <a href="#">Category 1</a>
    </li>
    <li>
        <a href="#">Subsubcategory 2</a>
    </li>
    <li>
        <a href="#">Category 3</a>
    </li>
</ul>

这是一个小提琴:http://jsfiddle.net/qacf2mn6/

我做错了什么?

1 个答案:

答案 0 :(得分:2)

想出来。我错过了var声明,所以它没有重置变量。

这里是正确的js代码:

function addCategories($list, cats) {
        _.each(cats, function(cat) {
                var $item = $('<li><a href="#">' + cat.name + '</a></li>');

                if(cat.children.length) {
                        var $subList = $('<ul></ul>');
                        $item.append($subList);
                        addCategories($subList, cat.children);
                }

                $list.append($item);
        });
}