1、工具函数 // 判断是否为obj对象 function isObj(object) { return object && typeof(object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]"; } // 判断是否为数组对象 function isArray(object) { return object && typeof(object) == 'object' && object.constructor == Array; } //获取obj对象的长度 function getLength(object) { var count = 0; for(var i in object) count++; return count; }
2、比较主函数
function Compare(objA, objB) { if(!isObj(objA) || !isObj(objB)) return false; //判断类型是否正确 if(getLength(objA) != getLength(objB)) return false; //判断长度是否一致 return CompareObj(objA, objB, true); //默认为true } function CompareObj(objA, objB, flag) { for(var key in objA) { if(!flag) //跳出整个循环 break; if(!objB.hasOwnProperty(key)) { console.log("hasOwnProperty.........."); flag = false; break; } if(isArray(objA[key])) { //子级是数组时, console.log("array.........."); if(!isArray(objB[key])) { console.log("B not array.........."); flag = false; break; } var oA = objA[key], oB = objB[key]; if(oA.length != oB.length) { console.log("A and B array.length not eq.........."); flag = false; break; } for(var k in oA) { if(!flag) //这里跳出循环是为了不让递归继续 break; flag = CompareObj(oA[k], oB[k], flag); } } else if(isObj(objA[key])){//子级是obj时, if(!isObj(objB[key])){ flag= false; break; }; if(getLength(objA[key]) != getLength(objB[key])) flag = false; //判断长度是否一致 if(!flag) //这里跳出循环是为了不让递归继续 break; flag = CompareObj(objA[key], objB[key], true); //默认为true } else {//子级既不是array,也不是obj,即子级时字符串或者数字 if(objB[key] != objA[key]) { console.log("not array...value.......",objB[key],objA[key]); flag = false; break; }; } } return flag; }
3、测试环节
var jsonObjA = { "Name": "MyName", "Company": "MyCompany", "Infos": [ { "Age": "100" }, { "Box": [{ "Height": "100" }, { "Weight": "200" } ] } ], "Address": "马栏山", "obj":{ "a":5566, } } var jsonObjB = { "Name": "MyName", "Company": "MyCompany", "Infos": [ { "Age": "100" }, { "Box": [{ "Height": "100" }, { "Weight": "200" } ] } ], "Address": "马栏山", "obj":{ "a":5566, } }
var result = Compare(jsonObjA, jsonObjB); console.log(result); // true or false