Глубокое равенство

Инструкции

Напишите функцию, которая принимает два элемента любого типа. Функция должна выполнять глубокое равенство

Входы: Any, Any Выход: Булево

Решение
Эта задача состоит из нескольких частей. Давайте рассмотрим ее логически.

  1. Сравнение NaN с NaN с помощью — или — всегда будет возвращать false. Поэтому нам нужно начать с проверки, являются ли оба входных элемента NaN.
  2. Если элементы имеют разный тип, мы можем сразу вернуть false.
  3. Если они одного типа и не являются объектами, мы можем вернуть результат простой операции равенства с помощью ===. Мы должны быть осторожны, чтобы включить сюда null, поскольку typeof null возвращает объект. Это связано с ошибкой в самом JavaScript (http://2£tlity.cDm/2013/10/typeof-null.html).
  4. Необходимо убедиться, что оба объекта имеют одинаковое количество свойств. Если это не так, верните false.
  5. Теперь нам нужно перебрать все ключи и убедиться, что они одинаковы для каждого объекта. Для этого мы можем перебрать первый объект и убедиться, что у второго объекта значения совпадают.
  6. Если все проверки пройдены, возвращаем true

Давайте преобразуем этот псевдокод в код.

function deepEquals(a, b) {
  if(Number.isNaN(a) && Number.isNaN(b)) {
    return true;
  }

  if(typeof a !== typeof b) {
    return false;
  }

  if(typeof a !== 'object' || a === null || b === null) {
    return a === b;
  }

  if(Object.keys(a).length !== Object.keys(b).length) {
    return false;
  }

  for(const key in a) {
    if(!deepEqualS(a[key], b[key])) {
     return false;
    }
  } 

  return true;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Время

Наша функция должна перебрать и обработать каждое свойство обоих элементов. Предполагая, что два входа глубоко эквивалентны, мы можем сказать, что временная сложность составляет:

0(n).

Пространство
Это рекурсивная функция, и количество вызовов обычно зависит от размеров объектов, поэтому:

0(n).

Оцените статью
devanswers.ru
Добавить комментарий