深度比较 JavaScript 函数

Deep Compare JavaScript function

我正在研究 Eloquent JavaScript 第 3 版,尽管我在 SO 上看到了一两个不同的答案,它们在执行逻辑上似乎与我的作品几乎相同无论我如何调整它,我的似乎都没有。

目标:创建一个深度比较函数,可以比较两个对象并根据它们的属性确定它们是否是同一类型对象的不同实例(相同的键和值),而不管引用...

谁能发现我代码中的错误?

function deepEqual(a,b){
  if((typeof a=='object'&& a!=null)&&(typeof b=='object'&& b!=null)){
   if(Object.keys(a).length != Object.keys(b).length){return false}    
    for(let key in a){
        if(a[key]==b[key]){
          if(!deepEqual(a[key],b[key])){return false}
        }else{
          return false
        }
    }
   return true
  }else if(a!==b){return false}

  else{return true}
}

var obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
// → true (reads true currently)
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false (reads false currently)
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true (reads false currently)

看起来您只需要调整您的 for 循环逻辑来捕捉对象(使用您自己的逻辑):

for(let key in a){
  let aValue = a[key]
  let bValue = b[key]

  if (typeof aValue == 'object' && typeof bValue == 'object') {
    // catches nested objects and recursively assesses deep equality
    if(!deepEqual(aValue, bValue)) return false
  }
  else if (aValue !== bValue) {
    // if the values are not objects, catches if they are not equal
    return false
  }
}

你可以在这里玩这个:https://jsbin.com/wotapezuwo/edit?js,console

错误在这里:

if (a[key] == b[key])

如果它们是对象,即使它们是 "equal",条件也可能 return 为假。

function deepEqual(a, b) {
  if (a && b && typeof a == 'object' && typeof b == 'object') {
    if (Object.keys(a).length != Object.keys(b).length) return false;
    for (var key in a) if (!deepEqual(a[key], b[key])) return false;
    return true;
  } else return a === b
}

var obj = {here: {is: "an"}, object: [2]};
console.log(deepEqual(obj, obj));
// → true 
console.log(deepEqual(obj, {here: 1, object: 2}));
// → false 
console.log(deepEqual(obj, {here: {is: "an"}, object: [2]}));
// → true