递归小练习

实现内容:
1、家谱树:寻找根节点, 最高层级的id;
2、寻找到根节点ID之后, 用递归的方法实现树状图;
3、将生成的树状图用递归的方法展开成一维有关系的数组(未生成树之前的数据格式)。

let list = [  // 网上随意找的一个有关系的数组变量
    {id: 1, name: '动物', pid: 0},
    {id: 2, name: '鸟类', pid: 5},
    {id: 3, name: '无脊椎动物', pid: 1},
    {id: 4, name: '哺乳动物', pid: 5},
    {id: 5, name: '脊椎动物', pid: 1},
    {id: 6, name: '喜鹊', pid: 2},
    {id: 7, name: '蚯蚓', pid: 3}
  ];

1、寻找根节点

function findPid(list, pid) {
    let obj = list.find(item => item.id === pid);
    return obj ? findPid(list, obj.pid) : pid
  }

2、用递归实现树状结构

function tree(list, pid) {
    let arr = list.filter(item => item.pid === pid);
    if (arr.length === 0) {
      return null
    } else {
      arr.forEach(item => {
        if (tree(list, item.id) !== null) {
          item.children = tree(list, item.id)
        }
      })
    }
    return arr
  }

let resultArr = tree(list, findPid(list, 5));  // 5为list中任意一条数据的pid

3、递归实现遍历树结构

function allList(arr, list1 = []) {
    arr.forEach(item => {
      list1.push(item);
      if (item.children && item.children.length > 0) {
        allList(item.children, list1)
      }
    });
    // 原来的数据里面没有children属性
    list1.forEach(item => delete item.children);
    return list1
  }

  console.log(allList(resultArr))

我自己也是在练习,如果有好的建议,欢迎留言区留言。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。