手写节流,防抖,递归(深拷贝),树形数据处理大全

65 阅读1分钟

纯手写实现节流、防抖、递归(深拷贝)、转换树形数据

节流

节流:顾名思义就是在一段时间内只执行第一次。

代码实现:

  function  throttle(fn,time){
    let timer = null
    return function(){
        if(!timer){
        timer = setTimeout(function(){
            fn()
            // 此处如果使用clearTimeut()是清除不掉延时器的只能赋值为null
            timer = null
        },time)      
    }}     
    }

防抖

防抖:在一段时间内只执行最后一次

代码实现:

  function debounce(fn,time){
  let timer = null
      return function(){
          if(timer) clearTimeout(timer)
          timer = setTimeout(function(){
              fn()
          },time)
      }
  }

递归实现深拷贝

代码实现:

    function cloneDeep(obj){
        let newObj = Array.isArray(obj) ? [] : {}
        for(let k in obj ){
            if(typeof obj[k] === "object"){
                newObj[k] = cloneDeep(obj[k])
            }else {
                  newObj[k] = obj[k]
            }  
        }
        return newObj
    }

实现树形数据

代码实现:

function getChild(arr,pid){
     let newArr = []
     arr.forEach(item=>{
         if(item.pid === pid){       
             if( getChild(item.id).length > 0){
              item.children = getChild(arr,item.id)
             }
         newArr.push(item)
         }    
     })
   return newArr
   }