0
点赞
收藏
分享

微信扫一扫

深拷贝,及数据对比

大师的学徒 2022-03-12 阅读 19
const deepCopy = (target) => {
    let rst
    if(typeof target === 'object'){
        // 数组
        if(Array.isArray(target)){
            rst = []
            target.forEach(item=>rst.push(deepCopy(item)))
        }else if(target === null || target.constructor === RegExp){
            // 正则和null
            rst = target
        }else{
            // 对象
            rst = {}
            for(let item in target){
                rst[item] = deepCopy(target[item])
            }
        }
    }else{
        // 基本类型
        rst = target
    }

    return rst
}

const obj = {
    a:{
        b:{
            c:{
                name:'123',
                list:[1,2,3,4,5]
            },
            id:'1234'
        },
        name:'56'
    },
    list:[1,2,3,4,5,6]
}



function compare(data,target){
    const dataType = typeof data
    const targetType = typeof target
    if(dataType !== targetType){
        return false
    }
    // 类型相同
    if(dataType !== "object" ){
        // 处理NaN
        if(Number.isNaN(data) || Number.isNaN(target)){
            return Number.isNaN(data) && Number.isNaN(target)
        }
        // 处理其他类型
        return data === target
    }else{
        // object类型,处理null
        if(!data || !target){
            return data === target
        }
        // 处理正则
        if(target.constructor === RegExp || data.constructor === RegExp){
            return data.toString() === target.toString()
        }

        // 处理数组
        if(Array.isArray(data) || Array.isArray(target)){
            const rst = []
            if(data.length !== target.length){
                return false
            }

            for(let i = 0; i < data.length ; i++){
                if(!compare(data[i],target[i])){
                    return false
                }
            }

            return true
        }

        // 处理对象
        if(!compare(Object.keys(data),Object.keys(target))){
            return false
        }

        for(let key in data){
            if(!compare(data[key],target[key])){
                return false
            }
        }
        return true
    }
}

console.log('--------------对象-----------------');
let newObj = deepCopy(obj)
console.log(compare(newObj,obj));
newObj.list.push(34)
console.log(compare(newObj,obj));
console.log('--------------数组[1,2],[1,2]-----------------');
console.log(compare([1,2],[1,2]));
console.log('--------------数组[[1,2],[1,2]]-----------------');
console.log(compare([[1,2],[1,2]],[[1,2],[1,2]]));
console.log('--------------数组[[1,2],[1,2]],[[1,2],[3,4]]-----------------');
console.log(compare([[1,2],[1,2]],[[1,2],[3,4]]));
console.log('--------------基础类型:1,1');
console.log(compare(1,1));
console.log(`--------------基础类型:1,'1'`);
console.log(compare(1,'1'));
console.log(`--------------基础类型:true,true`);
console.log(compare(true,true));
console.log(`--------------基础类型:Infinity,Infinity`);
console.log(compare(Infinity,Infinity));
console.log(`--------------基础类型:NaN,NaN`);
console.log(compare(NaN,NaN));

在这里插入图片描述

举报

相关推荐

深拷贝、浅拷贝

浅拷贝、深拷贝

深拷贝

深拷贝浅拷贝

深拷贝、浅拷贝、引用拷贝

浅拷贝VS深拷贝

深拷贝、浅拷贝、视图

JavaScript 深拷贝浅拷贝

0 条评论