Каталог 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
Источник: на задачах Ozon: фильтры каталога в адресе. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.