gpt4 book ai didi

javascript - Eloquent Javascript 练习 : Deep Comparison

转载 作者:行者123 更新时间:2023-11-28 03:20:19 25 4
gpt4 key购买 nike

我正在学习 JavaScript 并尝试做这个练习:

Write a function deepEqual that takes two values and returns true only if they are the same value or are objects with the same properties, where the values of the properties are equal when compared with a recursive call to deepEqual.

To find out whether values should be compared directly (use the === operator for that) or have their properties compared, you can use the typeof operator. If it produces "object" for both values, you should do a deep comparison. But you have to take one silly exception into account: because of a historical accident, typeof null also produces "object".

The Object.keys function will be useful when you need to go over the properties of objects to compare them.

这是我的解决方案,给出了 truefalsefalse 这是错误的

function deepEqual (a,b) {
if (a===b) return true;
if (typeof a=="object" && typeof b=="object") {
let x=Object.keys(a), y=Object.keys(b);
if (x.lenght==y.lenght) {
for (key of x){
if (y.includes(key)){
if (a[key]===b[key]) return true;
else return false;
}
}
}
return true;
}
}

let obj = {here: {is: "an"}, object: 2};
console.log(deepEqual(obj, obj));
console.log(deepEqual(obj, {here: 1, object: 2}));
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));

这是正确的解决方案:

function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
let keysA = Object.keys(a), keysB = Object.keys(b);
if (keysA.length != keysB.length) return false;
for (let key of keysA) {
if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
}
return true;
}


let 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)对象测试:

if (typeof a=="object" && typeof b=="object") {

这很好,但是如果这个条件不成立怎么办?您没有任何处理这种情况的代码,因此该函数将返回 undefined 。它应该返回 false相反。

其次,JavaScript 中有一个奇怪的事情,问题已经警告过你——你应该考虑到它:

...because of a historical accident, typeof null also produces "object".

...所以你需要对此进行单独的测试,如 null并不是真正一个对象,当您将其视为一个对象时,代码将会产生错误。

在您的代码中 null值将通过此 if测试然后执行Object.keys(null) ,这会触发异常。一个null那里不应该允许存在值。

2) 比较属性数量

    if (x.lenght==y.lenght) {

有一个拼写错误。它不是lenght ,但是length (2x)。再说一次,如果这个条件不成立怎么办?除了 return true 之外,没有任何代码可以处理这种情况。 之后 if block ,但你的函数应该返回 false .

3) 检查两个对象中是否存在属性

            if (y.includes(key)){

此测试有效,但不是最佳的。 includes比仅仅检查 key in b 慢(遗憾的是引用方案也使用 includes )。

和以前一样,如果这个条件不成立怎么办?该函数应立即退出循环并返回 false ,但这并没有发生...

4) 检查相同属性的值是否深度相等。

                if (a[key]===b[key]) return true;

此条件不会进行深度比较。该问题已经告诉您在这里要做什么:

...where the values of the properties are equal when compared with a recursive call to deepEqual

因此,在这种情况下,您应该执行递归调用,因此任何嵌套对象都以相同的方式进行比较。就a[key]===b[key]将是false当这两个值是单独的对象时。但条件确实应该是true当这些对象具有相同的属性和相同的值时...这正是您的函数能够执行的操作:因此在此处调用它。

其次,现在不是 return true 的时候,因为这将退出循环而不检查其他键,并且结果可能是负的......并且一个“负”足以使总体最终结果 false 。因此,虽然一切都很好,但您应该继续循环。

5) 当值不同时

                else return false;

是的,现在正是 return false .

6) 当所有测试都成功时

    return true;

这是 return true 的唯一正确位置,但你应该解决我的答案中的第二个评论,这样当长度不同时,该语句不会执行。

正确的代码

由于您已经有正确的代码可供比较,因此在这里重复该代码有点过分了。

关于javascript - Eloquent Javascript 练习 : Deep Comparison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59218035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com