js递归生成菜单的问题

数据结构大致如下:

data = [
{id: "1",pId: "0",name: "父级1",
children:[
    {id: "10", pId: "1", name: "子1",
    children:[
    {id: "101", pId: "10", name: "子1-1",children:[]},
    {id: "102", pId: "10", name: "子1-2",children:[
        {id: "1021", pId: "102", name: "子1-2-1",children:[]},
        {id: "1022", pId: "102", name: "子1-2-2",children:[]}
    ]}
    ]
    },
    {id: "12", pId: "1", name: "子2",children:[]},
    {id: "13", pId: "1", name: "子3",children:[]}
]
},
{id: "2",pId: "0",name: "父级2",
children:[
    {id: "20", pId: "2", name: "子1",children:[]},
    {id: "22", pId: "2", name: "子2",children:[]},
    {id: "23", pId: "2", name: "子3",children:[]},
    {id: "24", pId: "10", name: "子4",children:[
        {id: "241", pId: "24", name: "子4-1",children:[]},
        {id: "242", pId: "24", name: "子4-2",children:[
            {id: "2421", pId: "242", name: "子4-2-1",children:[]},
            {id: "2422", pId: "242", name: "子4-2-2",children:[]}
        ]}
    ]}
]
},
{id: "3",pId: "0",name: "父级3",
children:[
    {id: "30", pId: "3", name: "子1",children:[]},
    {id: "32", pId: "3", name: "子2",children:[]},
    {id: "33", pId: "3", name: "子3",children:[]},
    {id: "33", pId: "3", name: "子4",children:[]}
]
},
{id: "4",pId: "0",name: "父级4",
children:[
    {id: "40", pId: "4", name: "子1",children:[]},
    {id: "42", pId: "4", name: "子2",children:[]},
    {id: "43", pId: "4", name: "子3",children:[]}
]
}
]

想要生成的dom结构如下:

<ul id="tree-ul">
    <li><a href="#">父级1 <i class="iconfont icon-expand icon-arr-menu"></i></a>
        <ul>
            <li><a href="#">子1</a></li>
            <li><a href="#">子2 <i class="iconfont icon-expand icon-arr-menu"></i></a>
                <ul>
                    <li><a href="##">子2-1</a></li>
                    <li><a href="#">子2-2</a></li>
                    <li><a href="#">子2-3</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">父级2 <i class="iconfont icon-expand icon-arr-menu"></i></a>
        <ul>
            <li><a href="##">子1</a></li>
            <li><a href="#">子2</a></li>
            <li><a href="#">子3</a><i class="iconfont icon-expand icon-arr-menu"></i>
                <ul>
                    <li><a href="##">子3-1</a></li>
                    <li><a href="#">子3-2</a></li>
                    <li><a href="#">子3-3</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">父级3 <i class="iconfont icon-expand icon-arr-menu"></i></a>
        <ul>
            <li><a href="#">子1</a></li>
            <li><a href="#">子2</a></li>
            <li><a href="#">子3</a></li>
        </ul>
    </li>
</ul>

请问怎么用递归方式实现上面结构

自己写的代码有问题

function menuTree(menu, dt){
    for (var i = 0, len = dt.length; i < len; i++) {
        menu += '<li><a data-menuId="'+dt[i].id+'">'+dt[i].name+'<i class="iconfont icon-expand icon-arr-menu"></i></a>';
        if(dt[i].children){
            menu += '<ul>';
            menuTree(menu, dt[i].children);
            menu += '</ul>';
        }
        menu += '</li>';
    }
}
var menu = '';
menuTree(menu, data);
$('<ul></ul>').html(menu); // menu还是为空
阅读 2.2k
2 个回答
function menuTree(dt){
    var menu = ''
    for (var i = 0, len = dt.length; i < len; i++) {
        menu += '<li><a data-menuId="'+dt[i].id+'">'+dt[i].name+'<i class="iconfont icon-expand icon-arr-menu"></i></a>';
        if(dt[i].children){
            menu += '<ul>';
            menu += menuTree(dt[i].children);
            menu += '</ul>';
        }
        menu += '</li>';
    }
    return menu
}
var menu = menuTree(data);
$('<ul></ul>').html(menu);

用你的数据测试了,是可以的,你在找下原因,这个是在你的代码上稍微改的,如果还没出来,可以参考下思路,想下为什么这么改,如果错了又错在哪
图片描述

        let foo = (x) => {
          x += "xxx";
          console.log(x);
        };
        var content = 'zzz';
        foo(content);
        console.log(content);

Pass by value,content 是不会受到 foo 函数执行结果影响的。

针对你的问题,
1.可以将函数的 menu 参数删除,并将 menu 声明提前到函数之前。
2.修改函数,使用返回值。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题