Инструкции
Напишите функцию, которая принимает два элемента любого типа. Функция должна выполнять глубокое равенство
Входы: Any, Any Выход: Булево
Решение
Эта задача состоит из нескольких частей. Давайте рассмотрим ее логически.
- Сравнение NaN с NaN с помощью — или — всегда будет возвращать false. Поэтому нам нужно начать с проверки, являются ли оба входных элемента NaN.
- Если элементы имеют разный тип, мы можем сразу вернуть false.
- Если они одного типа и не являются объектами, мы можем вернуть результат простой операции равенства с помощью ===. Мы должны быть осторожны, чтобы включить сюда null, поскольку typeof null возвращает объект. Это связано с ошибкой в самом JavaScript (http://2£tlity.cDm/2013/10/typeof-null.html).
- Необходимо убедиться, что оба объекта имеют одинаковое количество свойств. Если это не так, верните false.
- Теперь нам нужно перебрать все ключи и убедиться, что они одинаковы для каждого объекта. Для этого мы можем перебрать первый объект и убедиться, что у второго объекта значения совпадают.
- Если все проверки пройдены, возвращаем 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).