- 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/
我是 Laravel 的新手,我正在处理我的数据库迁移。对于一个表,我在表定义中包含了 $table->timestamps() 快捷方式。令我沮丧的是,我发现在我为表设置种子后,created_at
我有一个任务需要显示每种类型的假期,其中 id 是奇数。当我尝试在 Eloquent 中执行它时,它总是给我一个错误。 查询 Select holiday_type.id, holiday_type.
我有一个任务需要显示每种类型的假期,其中 id 是奇数。当我尝试在 Eloquent 中执行它时,它总是给我一个错误。 查询 Select holiday_type.id, holiday_type.
好的,我有型号 A链接到许多模型 B , 所以型号 A有一个 hasMany与模型的关系 B和型号B有一个 belongsTo与模型的关系 A . 但是,在所有这些中B有一个特定的,例如具有较高值的
如何应用 Laravel 的 Eloquent whereIn() 以便它包含 null? 我已经尝试过: User::whereIn("column", [null, 1, 2]) -> get()
我有一张库存变动表,其中显示了产品的历史记录(接收、移动位置等) 我有两个计算(通过总和)的查询: 原收到数量。 当前的实时数量(在事物被移动之后)。 这两个查询都返回相同模型的集合。它们将始终具有相
我一直在研究 Slim 2,最近才开始部署到生产服务器。到目前为止,一切似乎都运行正常。我能够登录,所以我知道我正在连接到数据库就好了。它识别出我登录的人,识别出我作为该用户拥有的权限。我有另一个表有
我在 Eloquent 中使用 orWhere 时遇到问题。 我有一个团队,这个团队有一些资料。我想获取状态 = 1 或状态 = 2 的所有配置文件。但我无法让它工作。 我的代码是这样的: $prof
在 Zizaco/entrust的 Laravel Entrust,如何设置与 Eloquent 的 Entrust 类关系,以便获得角色拥有的权限列表,如下所示: // get admin role
我想为我的两个表创建一个汇总报告,一个是员工表,另一个是 sims 表。这些表具有一对多的关系。我知道我们可以通过使用导出模型的数据->fromModel($model)但是有没有办法让我可以根据这两
我有两个模型,一个是扩展 Jenssegers\Model 的 mongo 模型,另一个是扩展 Illuminate\Model 的 sql 模型。这个 sql 模型没有定义连接名称,因为我们有多个数
我有两个多对一关系的模型: class Meal extends \Eloquent { /** * public Integer $id; - primary key
到目前为止,Vue2 对我来说读起来非常好,但除了这一点我很难调试。 Shop-show.vue ..... ..... {{shop.user.id}} .....
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this q
我需要获取第二个表的 ID。我无法避免使用 INNER JOIN,因为我必须按第二个表中的列对结果进行排序。 这是我的两张 table events id name .... date
我正在尝试为我的用户提供 Laravel hiscores 分页表的排名数字。 这是我发现有效的 MySQL 查询。我正在尝试将其作为 Laravel Eloquent 查询来使用。 select @
我的产品模型上有这种关系。 public function productInventory(){ return $this->hasOne('App\Models\Ecommerce
我正在尝试在 Laravel 5.5 应用程序中为一个包含关系数据的表添加种子。 我有这两个表/模型: 用户 问题 在 app\User.php 模型文件上;我有以下 hasMany 关系: publ
我重写了这个帮助请求,并简化了我试图尽量减少移动部件数量的内容。 我是一名经验丰富的 OOP 程序员,但这是我使用 LAMP、Laravel 或 Eloquent 的第一个项目。 我正在 Larave
我正在使用 Laravel 和 MongoDB (jenssegers/laravel-mongodb) 开发一个网络应用程序。 在使用 php artisan make:model 创建新模型时,命
我是一名优秀的程序员,十分优秀!