Войти Регистрация
Фронтенд

34. Изменилась ли форма перевода: сравнение с Date, Map, Set и циклами

Сложная

Форма перевода в Т‑Банке хранит черновик: дату платежа (Date), лимиты по валютам (Map), выбранные карты (Set) и ссылку на родительский шаблон, который ссылается обратно. Кнопка «Сохранить» активна, только если черновик отличается от сохранённого снимка.

Напишите deepEqual(a, b). Примитивы равны по SameValueZero: NaN равен NaN, 0 равен -0. У объектов должен совпадать прототип: Map не равен объекту, массив не равен объекту с ключами 0, 1. Date равны, если совпадает время.

Map равны, если одинаковый размер и по каждому ключу (ключи — примитивы) значения глубоко равны; порядок вставки не важен. Set из примитивов равны, если состав одинаковый. Простые объекты и массивы — по собственным перечислимым ключам.

В данных бывают циклы: объект ссылается сам на себя. Функция должна завершиться и ответить верно.

В работе: Грязная форма и кнопка «Сохранить», пропуск лишних ререндеров, тесты снимков стейта.

Пример 1: одинаковая дата платежа

Аргументы теста
{"$date": "2026-10-21T10:00:00Z"}, {"$date": "2026-10-21T10:00:00Z"}
Ожидается
true

Пример 2: разные даты

Аргументы теста
{"date": {"$date": "2026-10-21T10:00:00Z"}}, {"date": {"$date": "2026-10-22T10:00:00Z"}}
Ожидается
false
Как проверяем Объявите deepEqual — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 13: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function deepEqual(a, b) // → boolean
рекурсияMapSetциклические ссылки

Источник: на задачах Т‑Банка: черновик перевода. Условие пересказано своими словами.