Сравнение объектов в JavaScript с помощью функции рекурсии - PullRequest
0 голосов
/ 24 сентября 2018

Может ли кто-нибудь провести меня через функцию рекурсии в этом коде ?, !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 голосов
/ 24 сентября 2018

Это довольно просто, давайте рассмотрим этот фрагмент кода, используя пример в ваших вопросах.

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

В приведенном выше случае вы сравниваете один и тот же объект, который, в свою очередь, ссылается на одну и ту же ячейку памяти, поэтому если (a === b) возвращает true; выполняется и возвращается true.

console.log (deepEqual (obj, {здесь: {is: "as"}, объект: 3}));

В этом примере, поскольку выВы сравниваете два разных объекта, т.е. разные области памяти, поэтому

  1. a === b - ложь;Теперь мы идем вперед, чтобы сравнить значения ключей объекта.
  2. a == null ... условие также выполнено, поэтому двигаться вперед
  3. длина клавиш одинакова, поэтому мы идем внутрь цикла for
  4. для key = здесь obj.here объект, и keysB включает сюда;следовательно, deepEqual (a [здесь], b [здесь]) выполняется;и шаги 1 и 2 возвращают false
  5. Теперь внутри для цикла deepequal a ["is"] == b ["is"], которое возвращает true.
  6. То же самое повторяется для a ["object"] == b ["object"] , что неверно, но a == null || ... get выполнено и, следовательно, возвращает false.

console.log (deepEqual (obj, {здесь: {is: "an"}, объект: 2}));

для этого все шаги в 2-йПример выполнения выполняется так же, как покупка на 6-м шаге a ["object"] == b ["object"] get выполнено, и, следовательно, вы получаете истину.

Надеюсь, это очистит всешаги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...