js-challenges icon indicating copy to clipboard operation
js-challenges copied to clipboard

判断两个对象是否相等

Open Sunny-117 opened this issue 3 years ago • 5 comments

Sunny-117 avatar Nov 03 '22 08:11 Sunny-117

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));

bearki99 avatar Feb 16 '23 12:02 bearki99

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));

Lance-racj avatar Mar 05 '23 09:03 Lance-racj

  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

kangkang123269 avatar Sep 11 '23 07:09 kangkang123269

简单点,如果不考虑健值对顺序不同的前提下,直接判断字符串是否相等就行了,相同的对象格式化后字符串相同(不适用里面含有function的情况~)

function isEqual(obj1, obj2) {
  return JSON.stringify(obj1) === JSON.stringify(obj2);
}

tyust512 avatar Nov 17 '23 02:11 tyust512

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
}

Aurora-GSW avatar Feb 29 '24 01:02 Aurora-GSW