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

35. Фильтры каталога Ozon в строку адреса

Средняя

Каталог Ozon хранит фильтры в адресе, чтобы ссылкой можно было поделиться и кэш CDN узнавал одинаковые выборки. Одна и та же выборка должна давать одну строку, иначе кэш промахивается: «brand=Nike&page=2» и «page=2&brand=Nike» для него разные адреса.

Напишите stringifyQuery(params) → строка без ?. Ключи верхнего уровня — по sort() без компаратора. Значения и ключи кодируются через encodeURIComponent (пробел — %20).

Массив даёт повтор ключа в исходном порядке: brand=Nike&brand=Adidas. Вложенный объект — один уровень, ключи в квадратных скобках по алфавиту: price[from]=1000&price[to]=5000; скобки не кодируются.

null, undefined, пустая строка и пустой массив пропускаются — и на верхнем уровне, и внутри массивов и вложенных объектов. 0 и false — настоящие значения: discount=0, inStock=false.

В работе: Фильтры и сортировка в адресе, ключи кэша запросов, ссылки «поделиться выборкой».

Пример 1: ключи по алфавиту, кириллица кодируется

Аргументы теста
{"text": "кроссовки", "page": 2}
Ожидается
"page=2&text=%D0%BA%D1%80%D0%BE%D1%81%D1%81%D0%BE%D0%B2%D0%BA%D0%B8"

Пример 2: массив — повтор ключа

Аргументы теста
{"brand": ["Nike", "Adidas"]}
Ожидается
"brand=Nike&brand=Adidas"
Как проверяем Объявите stringifyQuery — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 10: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function stringifyQuery(params) // → string
строкиURLкодирование

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