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