Deep Compare JavaScript功能

时间:2018-02-11 05:17:31

标签: javascript eloquent equals

我正在通过第3版的Eloquent JavaScript工作,尽管我已经看到一两个各种各样的答案在执行逻辑上看起来几乎完全相同,我的工作似乎没有不管我如何调整它。

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

有人能发现我的代码中的错误吗?

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)

2 个答案:

答案 0 :(得分:2)

错误发生在这里:

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

如果他们反对,即使他们“等于”,情况也可能会返回假。



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 




答案 1 :(得分:0)

看起来你只需要调整你的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