/*比较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;
}
function getLength(object) { // 获得对象有几个属性
var count = 0;
for (var i in object) count++;
return count;
}
// 比较对象
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 i = 0; i < objA.length; i++){
// 因为我传进来的是数组,类似于这样的结构,所以我循环每个项
[
{
"id": "85",
"name": "e",
"url": "baidu.com"
},
{
"id": 97,
"name": "2",
"subMenus": [
{
"id": 98,
"name": "2-1",
"url": "2-1"
},
{
"id": 99,
"name": "2-2",
"url": "2-2"
}
]
}
]
var objA1 = objA[i]; // 拿到每个obj进行比较
var objB1 = objB[i];
// 在对每个obj的属性进行比较
for (var key in objA1) {
//flag=false 跳出整个循环
if (!flag){
break;
}
// 判断B是否有该属性
if (!objB1.hasOwnProperty(key)) {
flag = false;
break;
}
if (!isArray(objA1[key])) { //子级不是数组时,比较属性值
if (objB1[key] != objA1[key]) {
flag = false;
break;
}
} else { // 子集为数组时
if (!isArray(objB1[key])) {
flag = false;
break;
}
// 拿到属性
var oA = objA1[key], oB = objB1[key];
if (oA.length != oB.length) {
flag = false;
break;
}
for (var k in oA) {
if (!flag) //这里跳出循环是为了不让递归继续
break;
flag = CompareObj(oA[k], oB[k], flag);
}
}
}
}
return flag;
}
最后调用
var result = Compare(init,newData); // true相同,false不同
网友评论