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

33. Кэш стоимости доставки до ПВЗ Wildberries по всем аргументам

Средняя

Корзина Wildberries пересчитывает стоимость доставки при каждом изменении: deliveryPrice(pvzId, weightKg, options). Расчёт идёт по тарифной сетке на 2–3 мс, а за минуту работы с корзиной его вызывают 400 раз с одними и теми же аргументами.

Напишите memoize(fn). Повторный вызов с теми же аргументами возвращает сохранённый результат, а fn не вызывается. Аргументы-примитивы сравниваются по значению и типу: 1 и '1' — разные ключи, NaN совпадает с NaN. Объекты и массивы — по ссылке: два разных объекта с одинаковым содержимым — разные ключи.

Число аргументов тоже часть ключа: f(5) и f(5, undefined) считаются по отдельности. Метод clear() у результата очищает кэш.

В работе: Селекторы стейта, тяжёлые расчёты в корзине, форматирование в списках.

Пример 1: те же аргументы — из кэша

Аргументы теста
[["call", 101, 2], ["call", 101, 2]]
Ожидается
[["number:101|number:2", 1], ["number:101|number:2", 1]]

Пример 2: другой вес — новый расчёт

Аргументы теста
[["call", 101, 2], ["call", 101, 3]]
Ожидается
[["number:101|number:2", 1], ["number:101|number:3", 2]]
Как проверяем Объявите memoize — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function memoize(fn) // → функция с методом clear()
замыканияMapкэширование

Источник: на задачах Wildberries: доставка до пункта выдачи. Условие пересказано своими словами.