Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

判断两个对象是否相等 #100

Open
Sunny-117 opened this issue Nov 3, 2022 · 5 comments
Open

判断两个对象是否相等 #100

Sunny-117 opened this issue Nov 3, 2022 · 5 comments

Comments

@Sunny-117
Copy link
Owner

No description provided.

@bearki99
Copy link

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

@Lance-racj
Copy link

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

@kangkang123269
Copy link

  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

@tyust512
Copy link

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

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

@gswysy
Copy link

gswysy commented Feb 29, 2024

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
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants