【问题标题】:Confused about negating a recursion condition, example code included对否定递归条件感到困惑,包括示例代码
【发布时间】:2020-06-22 22:00:04
【问题描述】:

好的,所以我正在尝试编写一个 deepEquals 函数来比较 javascript 中的对象并告诉您它们是否相等。也就是说,如果对象具有相同的属性,并且这些相同的属性具有相同的值。属性的顺序无关紧要。我对代码的递归部分以及它为什么起作用感到困惑。我看过一个视频,她写的代码几乎和我一样,但我不明白她是如何让她的代码工作的。无论如何,这是她的有效代码:

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

这是我的,它不起作用:

let deepEquals = (a,b) => {

    if ( a === b ) {
        return true;
    } else if ( a && b && typeof a === 'object' && typeof b === 'object' && Object.keys(a).length === Object.keys(b).length ) {
        for ( let key in a ) {
            if ( key in b ) {
                deepEquals(a[key], b[key]);
            }
        }
    }

    return false;
};
let person = {
    lastName: "Bone",
    firstName: "Jordan",
    age: 34,
    position: "Information Technology",
    nest: {
        value: 13,
        lamp: "no",
        etc: false,
        testNull: null
    }
}

let person1 = {
    firstName: "Jordan",
    lastName: "Bone",
    age: 34,
    position: "Information Technology",
    nest: {
        value: 13,
        lamp: "no",
        etc: false,
        testNull: null
    }
}

console.log(deepEquals(person, person1));
C:\Node\Jordan\JSON>node deepEqualsYouTube.js
false

我的问题是:

一个。很明显,为什么我的不工作?
湾。 if (!deepEquals(a[key], b[key]) 语句在说什么?我从未见过这样使用递归。这如何使代码工作?
C。为什么她会放一个“回归真实”; for {} 块之后的语句?为什么放在那里,代码什么时候放在那里?

如果有人能启发我了解我在这里所做的事情,那就太好了。非常感谢。

约旦

【问题讨论】:

    标签: javascript function loops recursion


    【解决方案1】:

    a)如果两个对象中都存在密钥,则您将丢弃 deepEquals 的结果。

    改变

    if ( key in b ) {
        deepEquals(a[key], b[key]);
    }
    

    到

    if (!( key in b ) || !deepEquals(a[key], b[key])){
       return false;
    }
    

    b) (!deepEquals(a[key], b[key]) 正在检查在 key 键处对对象 a 和 b 的值调用 deepEquals 的结果是否为 false,即值并不完全平等。

    c) 在循环之后有一个return true,因为循环会检查任何不完全相等的值。仅当所有值都相等时,执行才会到达该点,即deepEquals(a[key], b[key]) 没有为任何key 返回 false 并且两个对象具有相同的键。至此,这两个对象已经被证明是深度相等的。

    【讨论】:

    • 你能更深入地向我解释一下吗?你是什​​么意思我正在丢弃结果?否定函数有什么作用 (!deepEquals) - 这是否意味着如果它返回 true,则返回 false?或者如果返回false,返回true?
    • 啊,好吧,我想我明白了。不过,我还有一个问题,我非常感谢您的洞察力。在函数的开始处 if ( a === b ) {return true}; - 这不会在它获得 a === b 的递归调用并且没有完成其余键的情况下立即退出函数吗?它怎么不退出那里?
    • @Jordan 如果a 和b 严格相等,那么它们肯定相等,在这种情况下不需要遍历键。
    • 感谢您对 hev1 的所有帮助,但我仍然有点困惑。在函数的开头,它说 if ( a === b ) {return true};因此,当 for..in 循环递归并再次使用 a[key] 和 b[key] 调用函数时,与 === 相比,这两个对象值将返回 true。那么到那时,函数不会停止执行并且不会在它遇到的第一个匹配对( a === b )= true 处遍历对象的其余部分吗?还是我对调用堆栈感到困惑?如在,即使递归函数退出,for循环仍然存在?再次感谢。 -约旦
    • @Jordan 关于什么?
    猜你喜欢
    • 2017-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多