使用递归函数比较JavaScript中的对象

时间:2018-09-24 05:10:48

标签: javascript loops object recursion

有人可以引导我浏览此代码中的递归函数吗?!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"))的值,因此应该在对true;的第一次检查中返回if (a === b) return true;。并在第二次检查false;时返回if (a == null || typeof a != "object" || b == null || typeof b != "object") return 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. 

1 个答案:

答案 0 :(得分:1)

这非常简单,让我们使用问题中的示例遍历这段代码。

  

console.log(deepEqual(obj,obj));

在上述情况下,您正在比较同一个对象,该对象又指向相同的内存位置,因此 if(a === b)返回true; 被执行并返回true。

  

console.log(deepEqual(obj,{此处:{是:“ as”},对象:3})))

在此示例中,由于您要比较两个不同的对象,即不同的存储位置,因此

  1. a === b 为假;现在我们继续比较对象键的值。
  2. a == null ... 条件也得到满足,因此继续前进
  3. 密钥长度相同,因此我们进入了for循环
  4. 用于 key = here obj。这是一个对象,并且keysB包括在此处;因此,将执行 deepEqual(a [here],b [here]);步骤1和2返回false
  5. 现在在for循环内部,深度等于a [“ is”] == b [“ is”],返回true。
  6. a [“ object”] == b [“ object”] 重复相同的操作,但这不是正确的,但 a == null || ... 执行get,因此返回false。
  

console.log(deepEqual(obj,{此处:{是:“一个”},对象:2})))

为此,第二个示例中的所有步骤都以与第六个步骤中购买相同的方式执行。 a [“ object”] == b [“ object”] 被执行,因此您得到了真

希望这会清除所有步骤。