判断两个对象是否相等
Sunny-117 opened this issue · comments
const obj1 = { a: "11", b: { c: "22" } };
const obj2 = { a: "11", b: { c: "22" } };
function isEqual(obj1, obj2) {
const arr1 = Object.keys(obj1);
const arr2 = Object.keys(obj2);
if (arr1.length !== arr2.length) return false;
for (const k in arr1) {
if (typeof obj1[k] == "object" || typeof obj2[k] == "object") {
return isEqual(obj1[k], obj2[k]);
} else if (obj1[k] !== obj2[k]) return false;
}
return true;
}
console.log(isEqual(obj1, obj2));
const obj1 = { a: "11", b: { c: "22" } };
const obj2 = { a: { c: "22" }, b: { c: "22" } };
const _equal = (obj1, obj2) => {
let key1s = Object.keys(obj1);
let key2s = Object.keys(obj2);
if (key1s.length !== key2s.length) {
return false;
}
for(const key of key1s) {
if (typeof obj1[key] === 'object' && typeof obj2[key] === 'object') {
return _equal(obj1[key], obj2[key]);
} else if (typeof obj1[key] === 'object' || typeof obj2[key] === 'object') {
return false;
} else {
if (obj1[key] !== obj2[key]) {
return false;
}
}
}
return true;
}
console.log(_equal(obj1, obj2));
- loadsh._isEqual方法
- 简单实现上述方法:没有考虑循环引用、函数、特殊类型
function isEqual(a, b) {
// 如果 a 和 b 完全相等,返回 true
if (a === b) return true;
// 如果 a 和 b 的类型都是 "object" 并且不为 null
if (typeof a == 'object' && a != null && typeof b == 'object' && b != null) {
let keysA = Object.keys(a);
let keysB = Object.keys(b);
// 如果两个对象的属性数量不同,则返回 false
if (keysA.length != keysB.length) return false;
for (let key of keysA) {
// 如果两个对象中有任何一个对象没有此属性,则返回 false
if (!keysB.includes(key)) return false;
// 如果对于所有相同名字的键,a[key] 和 b[key] 都是深度相等,则继续比较下一个键。
if (!isEqual(a[key],b[key])) return false;
}
return true;
}
// 否则,它们可能是原始类型或者函数、日期、正则表达式等其他复杂类型,
// 这里我们假设这些情况下直接使用 === 就足够了。
else {
return a===b;
}
}
let obj1 = { foo: "bar", baz: [1,2,3]};
let obj2 = { foo: "bar", baz: [1,2,3]};
console.log(isEqual(obj1,obj2)); // 输出:true
let obj3 = { foo: "baz", qux: [4,5,6]};
console.log(isEqual(obj1,obj3)); // 输出:false
简单点,如果不考虑健值对顺序不同的前提下,直接判断字符串是否相等就行了,相同的对象格式化后字符串相同(不适用里面含有function的情况~)
function isEqual(obj1, obj2) {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
function isEqual(obj1, obj2) {
if (Object.keys(obj1).length !== Object.keys(obj2).length) return false
for (const key in obj1) {
if (obj1[key] !== obj2[key]) {
if (Array.isArray(obj1[key]) && Array.isArray(obj2[key]) || typeof obj1[key] === 'object' && typeof obj2[key] === 'object') {
if (!isEqual(obj1[key], obj2[key])) {
return false
}
} else {
return false
}
}
}
return true
}