从tree类型数据格式中找到自己想找到的数据(递归方式)

1、参考数据
[
    {
     id: 1,
     label: '一级 1',
     children: [
      {
       id: 4,
       label: '二级 1-1',
       children: [
        {
         id: 9,
         label: '三级 1-1-1',
        },
        {
         id: 10,
         label: '三级 1-1-2',
        },
       ],
      },
     ],
    },
    {
     id: 2,
     label: '一级 2',
     children: [
      {
       id: 5,
       label: '二级 2-1',
      },
      {
       id: 6,
       label: '二级 2-2',
      },
     ],
    },
    {
     id: 3,
     label: '一级 3',
     children: [
      {
       id: 7,
       label: '二级 3-1',
      },
      {
       id: 8,
       label: '二级 3-2',
       children: [
        {
         id: 11,
         label: '三级 3-2-1',
        },
        {
         id: 12,
         label: '三级 3-2-2',
        },
        {
         id: 13,
         label: '三级 3-2-3',
        },
       ],
      },
     ],
    },
   ]
2、递归函数
  function_recursive(data, target_id) {
   /**
    * 说明:
    *  -data:传入的data需为数据且不能为空
    *  -target_id:目标数据的id或其他内容,但必须为该条数据的唯一标识
    *  -target_data:固定返回一个Object对象
    */
   let target_data = {}
   if (!Array.isArray(data) || !data.length) {
    alert('传入的数据格式需为数组且不能为空...')
    return target_data
   }
   // 递归过程
   let get_target_data = item => {
    if (item.id == target_id) {
     target_data = item
    } else {
     if (item.children && item.children.length) {
      for (let i = 0; i < item.children.length; i++) {
       if (Object.keys(target_data).length) break // 如果已经找到了目标数据,记得break
       get_target_data(item.children[i])
      }
     }
    }
   }

   // for循环传入的data数据并开始递归
   for (let i = 0; i < data.length; i++) {
    if (Object.keys(target_data).length) break // 同上
    get_target_data(data[i])
   }
   return target_data
  },
3、调用
  test() {
   console.time('run-time')
   let a = this.function_recursive(this.tree_data, this.id)
   console.timeEnd('run-time')
   console.log(a) // 目标数据
  },

 

posted @ 2022-06-06 11:31  yw3692582  阅读(380)  评论(0)    收藏  举报