列表扁平化数据转树型结构非递归和递归

文章对比了递归和非递归方法在将列表数据转化为树形结构时的优缺点。非递归方法在处理大量数据时性能更优,但代码量较大;递归方法则代码简洁易懂,但不适合处理大量递归数据。示例代码分别展示了两种方法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 递归和非递归两种方式

 非递归方法:

优点:数据比较多的时候也可以使用,性能比递归方式快很多

缺点:代码较多些,没递归方式易懂

var arr = [
        { id: 1, pid: 0 },
        { id: 2, pid: 1 },
        { id: 4, pid: 1 },
        { id: 5, pid: 2 },
        { id: 6, pid: 2 },
        { id: 7, pid: 4 },
        { id: 8, pid: 0}
      ];
    //   列表转树 不使用递归方式
      function list2tree(list) {
        const arr = [];
        list.forEach((v) => {
          const newList = list.filter((k) => k.id !== v.id);
          // 如果没有找到这一项的父元素那么可以确定它是根元素
          // find 表示查找 找到了返回那一项 找不到返回undefined
          const root = newList.find((t) => t.id === v.pid);
          if (!root) {
            // 往数组中追加根元素
            arr.push(v);
          }
          // 找当前项的子元素
          const children = newList.filter((k) => k.pid === v.id);
          // 找到了就赋值
          if (children.length) {
            v.children = children;
          } else {
            v.children = [];
          }
        });
        return arr;
      }
      console.log(to(arr));

 

递归方法:

将列表型的数据转化成树形数据 => 递归算法 => 自身调用自身 => 一定条件不能一样, 否则就会死循环

优点:代码简洁,通俗易懂

缺点:只能少量递归数据时使用,太多数据教消耗性能



function transListToTreeData(list, rootValue) {
  var arr = []
  list.forEach(item => {
    if (item.pid === rootValue) {
      // 找到之后 就要去找item下面有没有子节点
      const children = transListToTreeData(list, item.id)
      if (children.length) {
        // 如果children的长度大于0 说明找到了子节点
        item.children = children
      }
      arr.push(item) // 将内容加入到数组中
    }
  })
  return arr
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值