JS中list转为tree,tree转为list的实现

一、list转tree的方法

我主要是用了两种方式:非递归递归

首先定义一个数组,拿到我们需要的数据:

        let arr = [
            {
                id: 1,
                parentId: 0,
                name: '市场部',

            },
            {
                id: 2,
                parentId: 0,
                name: '运维部'
            },
            {
                id: 3,
                parentId: 0,
                name: '开发部',
            }
            ,
            {
                id: 4,
                parentId: 1,
                name: '线下推广部'
            },
            {
                id: 5,
                parentId: 1,
                name: '网络推广部'
            },
            {
                id: 6,
                parentId: 3,
                name: '大前端',


            },
            {
                id: 8,
                parentId: 6,
                name: 'CRM系统开发',

            }
            , {
                id: 7,
                parentId: 3,
                name: '后端部'
            }

        ]

1.非递归

        首先我们捋一下非递归方法的思路:遍历arr中每一个元素,找这个元素的父亲(v.id === pid)。

  function listToTree(arr) {
            let resArr = []
            arr.forEach(v => {
                // 找这个元素的 父亲(item.id === v.parentId)
                // 去arr中 中 找v的父亲,找到的话,把v添加到父亲的children属性中
                let parentNode = arr.find(item => item.id == v.parentId);
                if (parentNode) {
                    // 如果没有找到父亲-说明 他是一级目录
                    if (parentNode['children']) {
                        //
                        parentNode['children'].push(v);
                    } else {
                        parentNode['children'] = [v];

                    }
                } else {
                    //说明这个v 没有父亲
                    // v 
                    resArr.push(v)
                }


            });

            return resArr;
        }

        // console.log(listToTree(arr));

2.递归

        递归的思想就是找儿子节点:遍历arr中的元素,看看元素的pid是否和id相等,如果相等就是它的孩子,添加到children中,第一个参数是id,第二个参数是存放孩子的数组,第三个参数是所有的元素数组。

function findChildren(id, children, arr) {

            arr.forEach(v => {
                if (v.parentId === id) {
                    children.push(v);
                    //v 有没有孩子
                    v.children = [];
                    //递归找v的孩子
                    findChildren(v.id, v.children, arr);
                }
            });
        }

        let r = []
        findChildren(0, r, arr);

        console.log(r);

二、tree转list的方法

        也是分为了递归和非递归两种方法,很简单,就直接给大家看代码吧!

        let brr = [
            {
                id: 1,
                parentId: 0,
                name: '市场部',
                children: [
                    {
                        id: 4,
                        parentId: 1,
                        name: '线下推广部'
                    },
                    {
                        id: 5,
                        parentId: 1,
                        name: '网络推广部'
                    },
                ]
            },
            {
                id: 2,
                parentId: 0,
                name: '运维部'
            },
            {
                id: 3,
                parentId: 0,
                name: '开发部',
                children: [
                    {
                        id: 6,
                        parentId: 3,
                        name: '大前端',
                        children: [
                            {
                                id: 8,
                                parentId: 6,
                                name: 'CRM系统开发',

                            }
                        ]


                    },
                    ,

                    , {
                        id: 7,
                        parentId: 3,
                        name: '后端部'
                    }

                ]
            }

        ]


        // 递归
        function treeToList(tree, resArr) {

            // 遍历tree -每一个元素,添加到resArr中
            tree.forEach(v => {
                // 把第一层元素 添加到resArr中
                resArr.push(v);

                // 判断是否有孩子,如果有孩子 ,添加到resArr中
                if (v.children) {
                    treeToList(v.children, resArr)
                }
            });
        }
        let r = []
        treeToList(brr, r)
        console.log(r);



        /**
         * 
        非递归
         queue = [,{id:4},{id:5},{}]

          resArr  {id:1} {id:2} {id:3},
         * 
        */
        function treeToList(tree) {

            // 定义空数组 -方法所有的tree中的元素
            let resArr = []
            // 定义了数组,放了tree里面的 第一层元素
            let queue = [...tree]

            // 循环--条件  queue 数组的长度不为0 就一直循环
            while (queue.length) {

                // 每次删除queue中第一个元素
                let v = queue.shift()
                // 如果可以取出来就把他添加到resArr
                if (v) resArr.push(v);

                // 判断v是否有孩子
                if (v && v.children) {
                    queue.push(...v.children)
                }

            }

            return resArr


        }

        console.log(treeToList(brr));

三、tree转ul,使用嵌套字符串渲染页面

        html代码很简单,写一个容器就好了

<div id="box"></div>

 js代码如下:

        let brr = [
            {
                id: 1,
                parentId: 0,
                name: '市场部',
                children: [
                    {
                        id: 4,
                        parentId: 1,
                        name: '线下推广部'
                    },
                    {
                        id: 5,
                        parentId: 1,
                        name: '网络推广部'
                    },
                ]
            },
            {
                id: 2,
                parentId: 0,
                name: '运维部'
            },
            {
                id: 3,
                parentId: 0,
                name: '开发部',
                children: [
                    {
                        id: 6,
                        parentId: 3,
                        name: '大前端',
                        children: [
                            {
                                id: 8,
                                parentId: 6,
                                name: 'CRM系统开发',

                            }
                        ]


                    },
                    ,

                    , {
                        id: 7,
                        parentId: 3,
                        name: '后端部'
                    }

                ]
            }

        ];

        //tree 转为 ul

        function treeToUl(tree) {
            // 遍历tree 数组-元素--拼接成多个 li字符串 
            let liStr = '';
            tree.forEach(obj => {
                //判断obj 是有有children -》 如果有 children 转为ul
                let secondUl = ''
                if (obj.children) {
                    secondUl = treeToUl(obj.children);
                }
                liStr += `<li>${obj.name}  ${secondUl}</li>`
            });
            let ulStr = `<ul>${liStr} </ul>`;
            return ulStr;
        }

        // console.log();

        document.querySelector('div').innerHTML = treeToUl(brr)

对于tree和list之间的两种状态转换,我们先捋清思路再练习,多敲敲熟悉代码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java,可以使用递归算法实现List转换为Tree,以及将Tree转换为List。 将List转换为Tree的步骤如下: 1. 创建一个根节点。 2. 遍历List的每个元素。 3. 如果元素是叶子节点,则将它添加到根节点下。 4. 如果元素是非叶子节点,则在根节点下创建一个子节点,并将元素添加到子节点下。 5. 对于每个非叶子节点,递归执行步骤2-4,直到所有元素都被处理完。 以下是将List转换为Tree的示例代码: ``` public class TreeNode { int val; List<TreeNode> children; public TreeNode(int val) { this.val = val; this.children = new ArrayList<>(); } } public TreeNode listToTree(List<Integer> list) { TreeNode root = new TreeNode(0); for (Integer val : list) { addToTree(root, val); } return root.children.get(0); } public void addToTree(TreeNode node, int val) { if (node.children.isEmpty()) { node.children.add(new TreeNode(val)); } else { TreeNode lastChild = node.children.get(node.children.size() - 1); if (lastChild.val < val) { lastChild.children.add(new TreeNode(val)); } else { addToTree(lastChild, val); } } } ``` 将Tree转换为List的步骤如下: 1. 创建一个List。 2. 将根节点添加到List。 3. 遍历根节点的子节点,将它们添加到List。 4. 对于每个子节点,递归执行步骤3,直到所有子节点都被处理完。 以下是将Tree转换为List的示例代码: ``` public List<Integer> treeToList(TreeNode root) { List<Integer> list = new ArrayList<>(); if (root == null) { return list; } list.add(root.val); for (TreeNode child : root.children) { list.addAll(treeToList(child)); } return list; } ``` 其TreeNode是一个表示节点的类,包含一个值和一个子节点列表。上述代码假设根节点的值为0,如果根节点不是叶子节点,则只有一个子节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值