Javascript 深度比较
Javascript Deep Comparison
对象深度比较的问题已经被问到,我有解决方案。但是解决方案中有一条我不完全理解的线。
这是解决方案,这是Eloquent JS第4章中比较对象的问题。我得到了所有内容,除了这一行:
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
它位于底部。这是完整的功能:
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || typeof a != "object" ||
b == null || typeof b != "object")
return false;
var propsInA = 0, propsInB = 0;
for (var prop in a)
propsInA += 1;
for (var prop in b) {
propsInB += 1;
if (!(prop in a) || !deepEqual(a[prop], b[prop]))
return false;
}
return propsInA == propsInB;
}
if (!(prop in a)
是在比较该索引处"b"中属性的存在,还是比较值?
关于后半部分,真的是相同的问题,但我知道这是一个不同的答案:!deepEqual(a[prop], b[prop])
进行哪种类型的比较(例如,真或假)?我理解递归,但就像我之前的问题一样,这是在进行"它存在"的比较,还是对值中信息的比较?
提前谢谢你。
根据 MDN:
如果指定的属性位于指定的对象中,则 in 运算符返回
true
。
也:
为...in 语句以任意顺序循环访问对象的可枚举属性。对于每个不同的属性,可以执行语句。
因此,要回答您的第一个问题,prop in a
检查对象b
中的字段prop
是否存在于对象a
中。
为了回答第二个问题,deepEqual(a[prop], b[prop])
检查对象a[prop]
和b[prop]
是否相等,包括其所有子项和内容。
如果表达式右侧的对象包含表达式左侧字符串值的键,则 in
运算符返回 true。
例如:如果a
包含与字符串值 prop
同名的键,则prop in a
为 true。 例如:
var prop = "age";
var obj1 = {
name: "Dave",
age: 21,
record: { ... }
};
var obj2 = {
name: "John",
record: { ... }
};
console.log(prop in obj1); // true
console.log(prop in obj2); // false
如果prop
设置为 "record"
则deepEqual(a[prop], b[prop])
递归比较 a.record
和 b.record
中的值。
它正在检查是否存在。它说:"对于 B 中的每个属性,检查 A。如果 A 没有该属性,或者 A 上的属性值与 B 上的属性值不完全相等,则返回 false"。
另一种实现将避免在该行上进行是否存在检查,而是在函数顶部使用 if (typeof A == 'undefined')
在每轮递归开始时验证输入参数......乍一看,我认为这是等效的,但效率较低。当前实现避免对未定义的属性进行调用。
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- jQuery自定义验证比较多个输入的序列
- 反向字符串比较
- 通过JSON&比较时间
- 递归深度比较
- 与 lodash 进行对象深度比较的数组
- Javascript 深度比较
- 角度深度比较对象(特定属性除外)
- JS深度比较2个对象并删除在第二个对象中找到的项目,而不是第一个
- Javascript -深度相等比较
- 是否有一个实用程序来深度比较对象在谷歌闭包库
- 存储在Mongo中的数组无法与具有相同长度和值的本地javascript数组进行深度断言比较
- 初学者- Javascript中的深度比较
- Angular进行深度比较,并返回每一项的差值
- 使用JSON可以吗?Stringify用于深度比较和克隆
- 深度比较(Eloquent Javascript第4章):代码在测试用例中失败
- Javascript:深度比较
- 深度递归比较:对象和属性
- 这个柜台的功能是什么?雄辩的JavaScript 4.4深度比较的例子