1. 程式人生 > >判斷物件是否相等

判斷物件是否相等

開發十年,就只剩下這套架構體系了! >>>   

使用最簡單的方法判斷兩物件或陣列是否相等

一、兩物件是否相等

已知兩純物件

let a = { a: 1, b: 2 };
let b = { a: 1, b: 2 };

我們都知道 a == b ,返回 false ,我們要如何寫一個方法,使得鍵值對都是一樣的則認為兩個物件是相等的?

方法如下:

let equalObject = (o1, o2) => {
	//判斷兩變數型別是否一致 如果沒有這個判斷 [1, 2], { '0': 1, '1': 2 } 會返回true;
	if (!(Object.prototype.toString.call(o1) == Object.prototype.toString.call(o2))) {
        return false;
    }
    if (!(o1 instanceof Object) || !(o2 instanceof Object)) {
        return false;
    }
    if (Object.keys(o1).length !== Object.keys(o2).length) {
        return false;
    }
    return Object.keys(o1).every(v => o1[v] === o2[v]);
};

如果兩物件是陣列,equalObject(arr1,arr2) 方法同樣適用;

二、 深度比較兩物件或陣列

實現一個方法,只要內容形態一致,則任務陣列或物件相等,例如:

let a = { a: [1, '2'], b: 2 };
let b =  { b: 2, a: [1, '2'] };

方法如下:

let equal = (o1, o2) => {
    if (!(Object.prototype.toString.call(o1) == Object.prototype.toString.call(o2))) {
        return false;
    }
    if (!(o1 instanceof Object) || !(o2 instanceof Object)) {
        return false;
    }
    if (Object.keys(o1).length !== Object.keys(o2).length) {
        return false;
    }
    return Object.keys(o1).every(v => {
        if (o1[v] instanceof Object) {
            return equal(o1[v], o2[v]);
        } else {
            return o1[v] === o2[v];
        }
    });
};

equal({ a: [1, '2'], b: 2 }, { b: 2, a: [1, '2'