zoukankan      html  css  js  c++  java
  • 用js递归遍历树结构

      今天同事拿到一笔数据,是个放菜单的数组,不知道总共有几层菜单,而且一级菜单,二级菜单...都是平级的。想说怎么把这个数组分出来,刚开始还想到的是循环,天哪,太麻烦了。后面有人说用递归,百度了一下,找到一个非常棒的解决方法,感谢大神。

       代码出处:http://blog.csdn.net/jayhkw/article/details/68945087

    <script>
    
        var data = [
            {
                id:1,
                name :"一级分类:1",
                pid :0,
            },
            {
                id:2,
                name :"二级分类:1",
                pid :1,
            },
            {
                id:3,
                name :"三级分类:3",
                pid :2,
            },
            {
                id:4,
                name :"一级分类:2",
                pid :0,
            },
            {
                id:7,
                name :"f级分类:2",
                pid :4,
            },
            {
                id:10,
                name :"f级分类:2",
                pid :7,
            },
            {
                id:9,
                name :"f级分类:2",
                pid :10,
            },
            {
                id:12,
                name :"f级分类:2",
                pid :9,
            },
            {
                id:15,
                name :"f级分类:2",
                pid :12,
            },
            {
                id:13,
                name :"f级分类:2",
                pid :15,
            },
        ]
    
    
    
        function toTree(data) {
            // 删除 所有 children,以防止多次调用
            data.forEach(function (item) {
                delete item.children;
            });
    
            // 将数据存储为 以 id 为 KEY 的 map 索引数据列
            var map = {};
            data.forEach(function (item) {
                map[item.id] = item;
            });
    //        console.log(map);
    
            var val = [];
            data.forEach(function (item) {
    
                // 以当前遍历项,的pid,去map对象中找到索引的id
                var parent = map[item.pid];
    
                // 好绕啊,如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
                if (parent) {
    
                    (parent.children || ( parent.children = [] )).push(item);
    
                } else {
                    //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
                    val.push(item);
                }
            });
    
            return val;
        }
    
        console.log(toTree(data))
    
    
    </script>
  • 相关阅读:
    各种计算
    C# 杂货
    Unity String格式化字符串
    unity 窗口化运行时取消边框
    WPF开机自启
    wpf 如何让当前窗口隐藏
    Unity 安卓杂货
    unity的一些杂货
    C# 项目中遇到过的坑(持续更新)
    C# 并入UI线程
  • 原文地址:https://www.cnblogs.com/yaoya/p/8351842.html
Copyright © 2011-2022 走看看