对象之间的深度比较

问题描述 投票:0回答:1

我正在学习Javascript,遇到了这个练习,这是我应该编写的“ deepEqual”函数,我无法解决,即使在看到解决方案后,我仍然还是不太明白。我不了解for循环,尤其是!deepEqual(a[key], b[key]))部分。为什么不能只说(keysA[key] !== keysB[key])(a[key] !== b[key])?我从这一行中读到的是:“如果对象ab中的键值不存在于deepEqual中,则return false”,但是这些值在那里,它们存在并且我不知道。看不到它们之间的比较。显然我错了,但这是我对代码的理解。请赐教。

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
javascript
1个回答
0
投票

您不能说a[key] != b[key],因为这些值可以是对象。并且为了比较对象,您必须递归比较它们的内容-这就是您必须首先编写此deepEqual()函数的全部原因。

行:

    if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;

表示如果false不具有b作为属性,或者两个对象的key属性递归都不相等,则返回key。>

如果该键确实存在,并且嵌套的对象相等,那么我们使用下一个键继续循环。

递归的根部的实际比较发生在第一行:

if (a === b) return true;
© www.soinside.com 2019 - 2024. All rights reserved.