/**
* 用途:获取目标类型
* 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})
}