- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 JavaScript 并尝试做这个练习:
Write a function
deepEqual
that takes two values and returnstrue
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 todeepEqual
.To find out whether values should be compared directly (use the
===
operator for that) or have their properties compared, you can use thetypeof
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.
这是我的解决方案,给出了 true
、false
、false
这是错误的
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/
K&R 前。 4.2 要求您修改给定的(非标准)atof 函数,该函数缺少处理指数的指数处理机制(如 123e6 或 456e-7)。我添加了一个最小的更改来处理正确输入的、无空格的个位数指数。为了检
我正在学习计算机科学入门类(class)的考试,我对“常规”算法和递归算法中的复杂性主题有疑问(通常我们将这些问题写成 C 代码). 我想知道 Internet 和/或书籍中是否有涵盖该主题的基础级别
console.log( ‘blah’.repeatMe( 3 ) ); 使用 Javascript 编写代码,使前面的函数打印: 输出:blahblahblah 最佳答案 噢,放弃函数式解决方案太有
我正在准备 Java SE 7 认证考试,并且正在做一些关于继承和访问修饰符的无聊练习。 但是现在我在应用继承时遇到了意外的行为。在我的基础包 com.testpkg 中,我有一个抽象类: packa
我刚刚开始了 C 语言队列的第一课,我得到了创建队列、向队列添加元素和删除元素的练习。但是,我在检查队列是满还是空时遇到了麻烦。 #include typedef struct FloatQueue
请问我从昨天开始就被困在下面这个问题中了。下面是问题: Write a program that uses console.log to print all the numbers from 1 to
我最近尝试了一些 Java,希望对我的风格进行一些评论。如果你喜欢看这个放在图像中的练习,并告诉我我的风格是否足够好?或者是做的还不够好,可以告诉我应该在哪方面多下工夫,帮我改进一下? exercis
我对手动编写 SQL 查询还很陌生,而且我有一个我似乎无法解决的练习。 我了解解决此问题所需的工具,但我就是想不出解决方案。 你能帮助我理解如何以一种能让我在未来解决类似练习的方式解决这个问题吗? 我
好吧,这就是练习: Define a class named student, containing three grades of students. The class will have a f
我是一个 JS 菜鸟,试图制作这个“你好,先生/小姐 你的名字!”干净的。我看不到在 if/else 中重构警报的方法,因为那样我就失去了 var b 的值。 JS: "use strict
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
反转二维数组的值,可以扩展 n 次。 [1, [2, [3, ... [n, null]]]] 给定: 所有数组的长度始终为 2 列表中的最后一个数组将包含一个 null 索引 1 示例: [1, [
我试图通过 Jason Hickey 笔记自学 OCaml,下面的练习让我难住了。 问题:编写一个函数 sum 给定两个整数边界 m,n 和函数 f 计算求和。 我正在尝试这个: let r
这是一个生成斐波那契数列的程序,这里是引用:http://sicp.org.ua/sicp/Exercise1-19 据说我们可以将程序视为“a <- bq + aq + ap and b <- bp
所以,我正在努力通过 SICP。 第 4 章的第一个练习是: Exercise 4.1. Notice that we cannot tell whether the metacircular eva
这个问题已经有答案了: Count the number of occurrences of a character in a string in Javascript (39 个回答) 已关闭 6
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我目前正在学习 JS,并且正在尝试进行编码练习。到目前为止,我已经成功地使用离线和在线部分代码的大量资源拼凑了以下代码。我已经非常接近了 - 只是结果中的数字无法正确。 一些背景:在函数中输入一个对象
我需要创建一个回收器 View 练习,这是一个带有简单的单个回收器的应用程序加载大小为 20 的页面,并且可以容纳无限数量的项目。 现在我不想做出重新加载越来越多的项目的幼稚解决方案,而是一个优雅的解
下面的实现正确吗? 输入:Oldrecords(GameRecord 对象数组)和 newRecords (GameRecord) 我将检查 oldRecords 数组中的 newRecord 值。如
我是一名优秀的程序员,十分优秀!