通用递归

export function isFunction<T extends (...args: any[]) => any | void | never>(value: T | unknown): value is T {
  return Object.prototype.toString.call(value) === '[object Function]'
}
/**
 * @Description: 通用递归
 * @Param [] list 树形结构
 * @Param  fn 函数,参数为树形的每一项, return true 表示中断此次递归
 * @Param {*} config, 配置项,children
 * @Return {*} 无返回值
 */
export const recursion =  (list = [], fn, config = { children: children }) => {
  const { children } = config
  const recursionFn = (arr = [], parent = null) => {
    let flag = false
    for( const item of arr ) {
      flag = isFunction(fn) ? fn(item, parent) : false
      if( flag ) {
        return true // 中断递归
      } else {
        flag = recursionFn(item[children] || [], item)
        if( flag ) {
          return true
        }
      }
    }
  }
  recursionFn(list)
}


// 使用
// 找出这棵树的id与父id
const listData = [{
  id: 1,
  parentId: 0,
  children: [{
    id: 2,
    parentId: 1,
    children: [{
       id: 3,
       parentId: 2,
    }]
  }]
}]
handleTree(){
  const deptPair = []
  recursion(listData, (item) => {
    deptPair.push({
      c: item.id,
      p: item.parentId
    })
  })
  return deptPair 
}

handleTree() // [{c: 1, p: 0}, {c:2, p: 1}, {c: 3, p: 2}]
 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容