Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

判断两个对象是否相等

Sunny-117 opened this issue · comments

commented
判断两个对象是否相等
commented
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));

  1. loadsh._isEqual方法
  2. 简单实现上述方法:没有考虑循环引用、函数、特殊类型
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
}