1. 程式人生 > >JS中如何比較兩個Json物件是否相等

JS中如何比較兩個Json物件是否相等

1、先準備三個工具方法,用於判斷是否是物件型別,是否是陣列,獲取物件長度;
2、準備兩個相同或不同的Json物件;
3、主要的程式碼;
4、呼叫程式碼。

一、判斷是否是物件型別,是否是陣列,獲取物件長度。

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; }

二、準備兩個相同或不同的Json物件

var jsonObjA = {
    "Name": "MyName",
    "Company": "MyCompany",
    "Infos"
: [{ "Age": "100" }, { "Box": [{ "Height": "100" }, { "Weight": "200" } ] } ], "Address": "馬欄山" } var jsonObjB = { "Name": "MyName", "Company"
: "MyCompany", "Infos": [{ "Age": "100" }, { "Box": [{ "Height": "100" }, { "Weight": "200" } ] } ], "Address": "馬欄山二號" }

三、主要的程式碼

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)) {
            flag = false;
            break;
        }
        if(!isArray(objA[key])) { //子級不是陣列時,比較屬性值
            if(objB[key] != objA[key]) {
                flag = false;
                break;
            }
        } else {
            if(!isArray(objB[key])) {
                flag = false;
                break;
            }
            var oA = objA[key],
                oB = objB[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(jsonObjA, jsonObjB);
console.log(result); // true or false