js 深度比较前对象属性及属性值在后对象中含有并相同 和 深度比较对象是否相同

/**
 * 用途:获取目标类型
 * target:传入的目标
 * 返回:字符串(目标类型)
 * */
function getTargetType(target){
    // [object String] [object Number]
    // [object Boolean] [object Symbol]
    // [object Undefined]  [object Null]
    // [object Function] [object Date]
    // [object Array] [object RegExp] 
    // [object Error] [object HTMLDocument] 
    // [object global] window 是全局对象 global 的引用
    return Object.prototype.toString.call(target);
}
/**
 * 用途:深度比较对象
 * original:原对象
 * target:目标对象
 * 返回:{flag:是否匹配正确,msg:信息}
 * */
function compareObjDeep(original,target){
    function returnFun(flag,data){
        return {flag:flag,msg:{info:data.info,org:data.org,target:data.target}}
    }
    function arrayRecursion(a,b){
        if(a.length!=b.length){
            return {flag:false,msg:"数组长度不同"};
        }
        for(var j=0;j<a.length;j++){
            var aType= getTargetType(a[j]);
            var bType= getTargetType(b[j]);
            if(aType!=bType){
                return returnFun(false,{info:"目标对象与原对象的值类型不同",org:a[j],target:b[j]})
            }else if(nextOrginType=="[object Object]"){
                var next = compareObjDeep(a[j],b[j]);
                if(!(next.flag)){
                    return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                }
            }else if(a[j]=="[object Array]"){
                return arrayRecursion(originValue[j],targetValue[j])
            }else {
                if(a[j]!=b[j]){
                    return returnFun(false,{info:"数据不相等",org:a[j],target:b[j]})
                }
            }
        }
        return returnFun(true,{info:"原数据在目标数据中都包含",org:original,target:target})
    }
    if(getTargetType(target)!="[object Object]"||getTargetType(original)!="[object Object]"){
        return false;
    }
    var originalKeys = Object.keys(original);
    for(var i=0;i<originalKeys.length;i++){
        if(target[originalKeys[i]]){
            var originValue = original[originalKeys[i]];
            var targetValue = target[originalKeys[i]];
            var originValueType = getTargetType(originValue);
            var targetValueType = getTargetType(targetValue);
            if(originValueType!=targetValueType){
                return returnFun(false,{info:"目标对象与原对象的值类型不同",org:originValue,target:targetValue})
            }
            switch(targetValueType) {
                case "[object Object]":
                    var next = compareObjDeep(originValue,targetValue)
                    if(!(next.flag)){
                        return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                    }
                    break;
                case "[object Array]":
                    if(originValue.length!=targetValue.length){
                        return returnFun(false,{info:"目标对象与原对象的值数组长度不同",org:originValue.length,target:targetValue.length})
                    }
                    for(var j=0;j<originValue.length;j++){
                        var nextOrginType= getTargetType(originValue[j]);
                        var targetOrginType= getTargetType(targetValue[j]);
                        if(nextOrginType!=targetOrginType){
                            return returnFun(false,{info:"目标对象与原对象的值类型不同",org:originValue[j],target:targetValue[j]})
                        }else if(nextOrginType=="[object Object]"){
                            var next = compareObjDeep(originValue[j],targetValue[j]);
                            if(!(next.flag)){
                                return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                            }
                        }else if(nextOrginType=="[object Array]"){
                            var next = arrayRecursion(originValue[j],targetValue[j])
                            if(!(next.flag)){
                                return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                            }
                        }else {
                            if(originValue[j]!=targetValue[j]){
                                return returnFun(false,{info:"数据不相等",org:originValue[j],target:targetValue[j]})
                            }
                        }
                    }
                    break;
                default:
                    if(originValue!=targetValue){
                        return returnFun(false,{info:"数据不相等",org:originValue,target:targetValue})
                    }
           } 
        }else{
            return returnFun(false,{info:"目标对象不存在"+originalKeys[i]+"属性",org:originalKeys[i],target:originalKeys[i]})
        }
    }
    return returnFun(true,{info:"原数据在目标数据中都包含",org:original,target:target})
}

若想深度比较两个对象是否完全一样,可以在其中对对象的key总长度和前后对象的key值进行判断


/**
 * 用途:深度比较对象是否相同
 * original:原对象
 * target:目标对象
 * 返回:{flag:是否匹配正确,msg:信息}
 * */
function compareObjDeepEqual(original,target){
    function returnFun(flag,data){
        return {flag:flag,msg:{info:data.info,org:data.org,target:data.target}}
    }
    function arrayRecursion(a,b){
        if(a.length!=b.length){
            return {flag:false,msg:"数组长度不同"};
        }
        for(var j=0;j<a.length;j++){
            var aType= getTargetType(a[j]);
            var bType= getTargetType(b[j]);
            if(aType!=bType){
                return returnFun(false,{info:"目标对象与原对象的值类型不同",org:a[j],target:b[j]})
            }else if(nextOrginType=="[object Object]"){
                var next = compareObjDeepEqual(a[j],b[j]);
                if(!(next.flag)){
                    return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                }
            }else if(a[j]=="[object Array]"){
                return arrayRecursion(originValue[j],targetValue[j])
            }else {
                if(a[j]!=b[j]){
                    return returnFun(false,{info:"数据不相等",org:a[j],target:b[j]})
                }
            }
        }
        return returnFun(true,{info:"原数据在目标数据中都包含",org:original,target:target})
    }
    if(getTargetType(target)!="[object Object]"||getTargetType(original)!="[object Object]"){
        return false;
    }
    var originalKeys = Object.keys(original);
    var targetKeys = Object.keys(target);
    if(originalKeys.length!=targetKeys.length){
        return returnFun(false,{info:"目标对象与原对象的属性总数不同",org:original,target:target})
    }
    for(var i=0;i<originalKeys.length;i++){
        if(target[originalKeys[i]]!=undefined){
            var originValue = original[originalKeys[i]];
            var targetValue = target[originalKeys[i]];
            var originValueType = getTargetType(originValue);
            var targetValueType = getTargetType(targetValue);
            if(originValueType!=targetValueType){
                return returnFun(false,{info:"目标对象与原对象的值类型不同",org:originValue,target:targetValue})
            }
            switch(targetValueType) {
                case "[object Object]":
                    var next = compareObjDeepEqual(originValue,targetValue)
                    if(!(next.flag)){
                        return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                    }
                    break;
                case "[object Array]":
                    if(originValue.length!=targetValue.length){
                        return returnFun(false,{info:"目标对象与原对象的值数组长度不同",org:originValue.length,target:targetValue.length})
                    }
                    for(var j=0;j<originValue.length;j++){
                        var nextOrginType= getTargetType(originValue[j]);
                        var targetOrginType= getTargetType(targetValue[j]);
                        if(nextOrginType!=targetOrginType){
                            return returnFun(false,{info:"目标对象与原对象的值类型不同",org:originValue[j],target:targetValue[j]})
                        }else if(nextOrginType=="[object Object]"){
                            var next = compareObjDeepEqual(originValue[j],targetValue[j]);
                            if(!(next.flag)){
                                return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                            }
                        }else if(nextOrginType=="[object Array]"){
                            var next = arrayRecursion(originValue[j],targetValue[j])
                            if(!(next.flag)){
                                return returnFun(false,{info:next.msg.info,org:next.msg.org,target:next.msg.target})
                            }
                        }else {
                            if(originValue[j]!=targetValue[j]){
                                return returnFun(false,{info:"数据不相等",org:originValue[j],target:targetValue[j]})
                            }
                        }
                    }
                    break;
                default:
                    if(originValue!=targetValue){
                        return returnFun(false,{info:"数据不相等",org:originValue,target:targetValue})
                    }
           } 
        }else{
            return returnFun(false,{info:"目标对象不存在"+originalKeys[i]+"属性",org:originalKeys[i],target:originalKeys[i]})
        }
    }
    return returnFun(true,{info:"两个对象完全相同",org:original,target:target})
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值