对比json串

237 阅读1分钟

//对比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);
};