文中還使用了sort函式來排序,這樣做的好處是儘管物件順序不一致也可以比較相等
let obj = {
leftDom1: 'rightDom1',
leftDom2: 'rightDom1',
leftDom3: 'rightDom3',
leftDom4: 'rightDom2',
};
let obj2 = {
leftDom2: 'rightDom1',
leftDom3: 'rightDom3',
leftDom4: 'rightDom2',
leftDom1: 'rightDom1',
};
function compareObjects(obj1, obj2) {
const keys1 = Object.keys(obj1).sort();
const keys2 = Object.keys(obj2).sort();
if (keys1.length !== keys2.length) {
return false;
}
for (let i = 0; i < keys1.length; i++) {
if (keys1[i] !== keys2[i] || obj1[keys1[i]] !== obj2[keys2[i]]) {
return false;
}
}
return true;
}
console.log(compareObjects(obj, obj2)); // true
如果有多維物件怎麼辦呢?我們需要進行遞迴一下
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
function deepCompare(obj1, obj2) {
if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {
console.log('obj1 === obj2', obj1 === obj2);
return obj1 === obj2;
}
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
const keys1 = Object.keys(obj1).sort();
const keys2 = Object.keys(obj2).sort();
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
if (keys1.length !== keys2.length) return false;
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
for (let i = 0; i < keys1.length; i++) {
const key1 = keys1[i];
const key2 = keys2[i];
const val1 = obj1[key1];
const val2 = obj2[key2];
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
if (key1 !== key2) return false;
// 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
if (!deepCompare(val1, val2)) return false;
}
return true;
}
測試一下
// 字元與陣列
const obj1 = ['aaa'];
const obj2 = 'aaa';
console.log(deepCompare(obj1, obj2)); // false
// 字元與字元
const obj1 = 'aaa';
const obj2 = 'aaa';
console.log(deepCompare(obj1, obj2)); // true
// 物件與物件
const obj1 = {
a: {
b: {
c: {
d: 1, //順序不一樣
e: 2,
},
},
},
};
const obj2 = {
a: {
b: {
c: {
e: 2,
d: 1,
},
},
},
};
console.log(deepCompare(obj1, obj2)); // true