递归实现给树赋值

103 阅读2分钟

我也是第一次尝试在掘金上面写文章,每次都是看别人的博客,这次自己也想试试。下面是我之前遇到过的一个递归案例,虽然这个案例不是很难也算是我自己学会使用递归的第一个记录,对我自己感觉算是一点点宝贵的积累,分享给掘友们希望大家多多包容。

递归的具体操作:

  1. 递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件
  2. 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件
  3. 所以递归要有两个要素,结束条件与递推关系
  4. 递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。
  • 接口返回格式:name是唯一的标识
[
    {
        name: "三级目录01",
        num: 1
    },
    {
        name: "三级目录01",
        num: 2
    }
]
  • 树形数据格式:name是唯一的标识
   treeData: {
        name: '根目录',
        num: 0,
        childern: [
          {
            name: '二级目录01',
            num: 0,
            childern: [
              {
                name: '三级目录01',
                num: 0
              },
              {
                name: '三级目录02',
                num: 0
              }
            ]
          }
        ]
      }
  • 需求:接口返回的数据赋值到树上
  • 解决思路:使用递归给树赋值,
  1. 首先循环遍历第一层的数据,在第一层循环中匹配的与接口数据的name相等的数据进行num赋值
  2. 然后再判断第一项是否有children,有children就继续执行第一步的操作,直到没有children为止
  3. 最终返回当前赋值后的树形数据
  • 部分代码:
    //树数据
     treeData: [{
        name: 'a',
        num: 0,
        childern: [
          {
            name: 'b',
            num: 0,
            children: [
              {
                name: 'c',
                num: 0
              },
              {
                name: 'd',
                num: 0,
                 children: [
                  {
                    name: 'e',
                    num: 0
                  },
                  {
                    name: 'f',
                    num: 0
                  }
            ]
              }
            ]
          }
        ]
      }]
      //接口数据
      todoData:[
        {
            name: "a",
            num: 1
        },
        {
            name: "c",
            num: 2
        },
         {
            name: "e",
            num: 2
        }
      ]
      
     //递归方法
      methods:{
         setTreeData(treeData, todoData) {
          treeData.forEach(item => {
            item.num = 0;
            todoData.forEach(dataItem => {
              if (dataItem.name === item.name) {
                item.num = dataItem.num;
              }
            });
            if (item.children && item.children.length) {
              this.setTreeData(item.children, todoData*);*
            }
          });
          return treeData;
        },
      }