手写功能函数: 递归实现深拷贝

函数设计

功能

递归实现数据的深拷贝

参数

被拷贝的数据

返回值

拷贝完的新数据

思路

1.需要先判断数据类型,主要分为三种,数组类型,对象类型,其他类型

2.对于对象类型和数组类型的,都需要使用递归对其进行深度的拆解,直至成为其余的类型

3.对于其余类型,可以作为函数返回值进行赋值

实现

        //这里的深拷贝仅限于常规对象和常规数组
        function cloneDeep(value) {
            let initVal = null
            let valueType = toString.call(value)
            switch (valueType) {
                case '[object Object]':
                initVal = {}
                let arrs = Object.keys(value)
                if(arrs.length>0){
                    arrs.forEach((item)=>{
                  initVal[item] = cloneDeep(value[item])
                })
                return initVal
                }else{
                 return {}
                }
                    break
                case '[object Array]':
                let arr = []
                if(value.length>0){
                 value.forEach((item,index)=>{
                    arr[index] = cloneDeep(item)
                 })
                 return arr
                }else{
                    return []
                }
                    break
                default:
                    return value
            }
        }

测试

    <script>
        //这里的深拷贝仅限于常规对象和常规数组
        function cloneDeep(value) {
            let initVal = null
            let valueType = toString.call(value)
            switch (valueType) {
                case '[object Object]':
                initVal = {}
                let arrs = Object.keys(value)
                if(arrs.length>0){
                    arrs.forEach((item)=>{
                  initVal[item] = cloneDeep(value[item])
                })
                return initVal
                }else{
                 return {}
                }
                    break
                case '[object Array]':
                let arr = []
                if(value.length>0){
                 value.forEach((item,index)=>{
                    arr[index] = cloneDeep(item)
                 })
                 return arr
                }else{
                    return []
                }
                    break
                default:
                    return value
            }
        }
       
        let family = [
            {
                name:'王惊涛',
                age:27,
                love:['吃饭','睡觉','写代码'],
                gender:true,
                work:{
                    name:'coder',
                    love:function(){
                        console.log('编码')
                    }
                }
            },
            {
                name:'马师',
                age:28,
                love:['吃饭','吃饭','还是吃饭'],
                gender:false,
                work:null,
                pi:undefined
            }
        ]
        let cloneShallow = family
        let cloneFamily = cloneDeep(family)
        console.log(cloneShallow === family,'浅拷贝')
        console.log(cloneFamily === family,'递归深拷贝')
        console.log(cloneFamily,'深拷贝后的对象')
    </script>

猜你喜欢

转载自blog.csdn.net/m0_54741495/article/details/132473165