javascript - 递归深度比较

标签 javascript algorithm recursion comparison

对于递归练习/乐趣,我希望构建一个递归函数来对两个唯一对象执行深度比较。到目前为止,我的代码带有伪代码注释。

我认为我的错误可能是我对 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;
    }
}

最佳答案

您的函数缺少空对象的基本情况,即没有自己的键(不再)的对象。它永远不会真正返回 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;
}

关于javascript - 递归深度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29532094/

相关文章:

algorithm - 如何找到最长的可能路径?

algorithm - 具有多个根顶点的图中的最小生成树

performance - Matlab 中更快的矩阵递归

java - 有人可以解释一下这段代码吗?排列码

node.js - 为什么这个 firebase 函数会递归运行?

javascript - Angular 2.仅更改焦点元素的类

javascript - 将值从 django 服务器发送到客户端?

javascript - 在Highcharts中,对于3D图表,我们可以设置z轴的标签吗?

php - 如何去除css中的跨浏览器效果

c++ - 理解Visual C++的rand()函数的算法