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

57. Смена фильтра в адресе поиска квартир на Авито

Средняя

В поиске квартир на Авито фильтры живут в адресе: /moskva/kvartiry?rooms[]=1&rooms[]=2&price_max=9000000&p=3#map. Ссылкой делятся в мессенджере, и по ней должна открыться та же выдача.

Напишите updateUrl(url, patch). url — путь с необязательными ?query и #hash. patch — объект: строка или число заменяет параметр, массив пишется повтором key[]=значение (старые значения ключа выбрасываются), null и пустой массив удаляют параметр.

Параметры, которых нет в patch, остаются как были, в том же порядке и том же написании. Изменённый параметр стоит на месте старого, новые добавляются в конце в порядке ключей patch. Значения кодируются через encodeURIComponent, скобки [] в имени — нет.

Если patch меняет что-то кроме p, номер страницы p удаляется: после смены фильтра показываем первую страницу. Если параметров не осталось, ? не пишется. #hash сохраняется.

В работе: Человек на 3-й странице выдачи добавил «3 комнаты» — новая выдача короче, и 3-я страница может оказаться пустой.

Пример 1: добавили комнату, страница сброшена

Аргументы теста
"/moskva/kvartiry?rooms[]=1&rooms[]=2&price_max=9000000&p=3#map", {"rooms": [1, 2, 3]}
Ожидается
"/moskva/kvartiry?rooms[]=1&rooms[]=2&rooms[]=3&price_max=9000000#map"

Пример 2: смена страницы не сбрасывает её же

Аргументы теста
"/moskva/kvartiry?rooms[]=2&p=3", {"p": 4}
Ожидается
"/moskva/kvartiry?rooms[]=2&p=4"
Как проверяем Объявите updateUrl — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 10: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function updateUrl(url, patch) // → string
URLquery stringмассивы в параметрахencodeURIComponent

Источник: на задачах Авито: поиск недвижимости, фильтры в адресе. Условие пересказано своими словами.