文中还使用了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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。