//对比JSON串是否相同
$compareJson = function(jsonObjA, jsonObjB){
var isObj = function(object) {//是否是对象
return object && typeof (object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
};
var isArray = function(object){//是否是数组
return object && typeof(object) == "object" && object.constructor == Array;
};
var getLength = function(object){//获取对象长度
var count = 0;
for(var i in object){
count++;
}
return count;
};
/**
* var a = {
* a1:'string',
* a2:['string1','string2'],
* a3:{b1:1,b2:2,b3:3},
* a4:[{c1:1,c2:2},{},{}],
* a5:[[],[]]
* };
*
*/
//a是对象
var compareObj1 = function(a,b){
if(!isObj(b)){//oB不是对象
return false;
}
if(getLength(a) != getLength(b)){//判断长度是否相等
return false;
}
return compareObj(a,b,true);
};
//a不是数组
var compareNotArray = function(a,b){
if(b != a){
if(isObj(a)){//key=a3,oA={};
return compareObj1(a,b);
}else{//key=a1,oA='string'
return false;
}
}
return true;
};
//a是数组
var compareArray = function(a,b){
if(!isArray(b)){
return false;
}
if(a.length != b.length){
return false;
}
var localFlag = true;
for(var k in a){
if(!localFlag){
break;
}
if(!b.hasOwnProperty(k)){//若B中没有相应的key属性
localFlag = false;
break;
}
var a1 = a[k], b1 = b[k];
if(isArray(a1)){
localFlag = compareArray(a1,b1);
}else{
localFlag = compareNotArray(a1,b1);
}
}
return localFlag;
};
var compareObj = function(objA, objB, flag){//a = objA
for(var key in objA){//key = a1,a2,a3...
if(!flag){
break;
}
if(!objB.hasOwnProperty(key)){//若B中没有相应的key属性
flag = false;
break;
}
var oA = objA[key], oB = objB[key];
if(!isArray(oA)){//key=a1,oA='string';key=a3,oA={};
flag = compareNotArray(oA,oB);
}else{//key=a2,oA=['string1','string2'];key=a4,oA=[{c1:1,c2:2},{},{}];key=a5,oA=[[],[]];
flag = compareArray(oA,oB);
}
}
return flag;
};
var compare = function(objA,objB){
if (!isObj(objA) || !isObj(objB)){//判断类型是否正确
return false;
}
if(getLength(objA) != getLength(objB)){//判断长度是否相等
return false;
}
return compareObj(objA,objB,true);
};
return compare(jsonObjA, jsonObjB);
};