深度比较 JavaScript 函数

2024-02-02

我正在阅读《Eloquent JavaScript》第三版,尽管我在 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)

错误就在这里:

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

如果它们是对象,即使它们“相等”,条件也可能返回 false。

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 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度比较 JavaScript 函数 的相关文章

随机推荐