递归深度比较

3

为了练习/娱乐递归,我希望构建一个递归函数,执行两个唯一对象的深度比较。 我迄今为止的代码,带有伪代码注释。

我认为我的错误可能在于对delete的理解,因为递归没有解决obj1和obj2的减小大小。

function deepCompare(obj1, obj2) {
    //Base Cases
    if (obj1 === obj2) {
        return true;
    };
    if (Object.keys(obj1).length !== Object.keys(obj2).length) {
        return false;
    };

    //Getting arbitrary key of obj1
    var key = Object.keys(obj1)[0];

    //Check to see if key is in obj2
    if (obj2.hasOwnProperty(key)) {
        //Check equality of value at key
        if (obj2.key == obj1.key) {
            //Remove key/value pair from each object, recursively call
            delete obj2.key;
            delete obj1.key;
            deepCompare(obj1, obj2);
        } else {
            return false;
        }
    } else {
        return false;
    }
}
2个回答

2

您的函数缺少空对象的基本情况,即没有自有键的对象(不再有)。 它从未真正返回true(对于非相同的对象)。

因此,您需要执行以下操作:

function deepCompare(obj1, obj2) {
    //Base Cases
    if (obj1 === obj2) {
        return true;
    }
    var keys = Object.keys(obj1);
    if (keys.length !== Object.keys(obj2).length) {
        return false;
    }
    if (keys.length == 0) {
        return true;
    }
    //Getting arbitrary key of obj1
    var key = keys[0];
    …

另外,您在递归调用中忘记了一个return语句。

但是请注意,比较函数绝不能修改它要比较的值。因此,不要使用delete,而是使用对键进行循环。

function deepCompare(obj1, obj2) {
    if (obj1 === obj2) return true;
    if (typeof obj1 != typeof obj2) return false; // needed for structurally different objects
    if (Object(obj1) !== obj1) return false; // primitive values
    var keys = Object.keys(obj1);
    if (keys.length != Object.keys(obj2).length) return false;
    for (var i=0; i<keys.length; i++) {
        var key = keys[i];
        if (!Object.prototype.hasOwnProperty.call(obj2, key)) return false;
        if (!deepCompare(obj1[key], obj2[key])) return false;
    }
    return true;
}

1

希望它有所帮助

编辑,感谢 @TrueBlueAussie

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

1
不需要使用rta变量。你只需要使用if (!deepcompare(a[k], b[k])) return false; - iCollect.it Ltd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接