【发布时间】:2019-02-27 14:11:02
【问题描述】:
有人可以指导我了解这段代码中的递归函数吗?!deepEqual(a[key], b[key])。每次调用时它如何比较它的值?...
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 i = 0; i <= keysA.length -1; i++) {
let key = keysA[i];
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: {is: "as"}, object: 3}));
// → false
console.log(deepEqual(obj, {here: {is: "an"}, object: 2}));
// → true
我真的需要了解递归函数循环如何通过第二次调用而不在第一次检查时返回 true 而在第二次检查时返回 false
if (a == null || typeof a != "object" ||
b == null || typeof b != "object") return false;
因为!deepEqual(a["is"], b["is"])) == !deepEqual("is", "is")) 的值,因此在第一次检查if (a === b) return true; 时应该返回true;。并在第二次检查 if (a == null || typeof a != "object" || b == null || typeof b != "object") return false; 时返回 false;,因为它不是对象。
不会阻止函数完成对 剩余属性?
谁能给我讲清楚?
let obj = {here: {is: "an", that: "at", name: "ola", here: {is: "as"}, object: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: {is: "an", that: "at", name: "ola", here: {is: "as"}, object: 3}));
// → false
//The only different property value is in the second argument's last property.
【问题讨论】:
-
如果你想比较两个对象然后把它们都转换成字符串然后检查相等性。
-
@ArifRathod 仅在 javascript 保证在字符串化时按字母顺序排列键时才有效。我不相信有这样的保证
-
是的,你是对的,所以你应该先对对象进行排序,然后再进行比较。这将有效。我不认为我们应该写很长很复杂的逻辑来比较这两个对象。
-
所以有人可以用我可以查看的分解代码形式或图表为我说明这一点。如果它是可见的,我会抓住这个想法
-
@Ola-Juwon 我想你会喜欢this Q&A
标签: javascript loops object recursion