О том, что такое мемоизация, можно узнать в отдельной статье.
На самом деле, всё это довольно просто. Попробуем написать функцию-обёртку memoize, с помощью которой можно мемоизировать любую другую функцию. Начнём как всегда с интерфейса:
javascript1function memoize(func) { 2 // ... 3} 4
Наша функция-обёртка будет принимать только целевую функцию, которую мы хотим мемоизировать. В качестве кэша будем использовать Map:
javascript1const cache = new Map(); 2
И далее просто воспользуемся замыканием, чтобы ограничить доступ к созданному кэшу только для целевой функции. Для этого вернем из memoize новую функцию:
javascript1return function(...args) { 2 // ключ сериализуем в строку, чтобы 3 // не было проблем с аргументами 4 // объектами, массивами и т.д. 5 const key = JSON.stringify(args); 6 7 // проверяем есть ли результат в кэше 8 if (!cache.has(key)) { 9 // если нет, то сохраняем в кэш 10 // значение вызова функции 11 cache.set(key, func(...args)); 12 } 13 14 // и возвращаем значение из кэша 15 return cache.get(key); 16}; 17
Полный код функции:
javascript1function memoize(func) { 2 const cache = new Map(); 3 4 return function(...args) { 5 const key = JSON.stringify(args); 6 7 if (!cache.has(key)) { 8 cache.set(key, func(...args)); 9 } 10 11 return cache.get(key); 12 }; 13} 14
Статья была полезной?
Читайте также:
— 2 минуты
Что такое Server-Sent Events
SSE — это технология для однонаправленного соединения между сервером и клие...
— 4 минуты
Связываем React и localStorage через useSyncExternalStore
Как согласовать изменение состояния в реакте и поля в localStorage? До нед...
— 3 минуты
Теги для шаблонных строк
В JavaScript есть, как по мне, крайне странный синтаксис. Самым очевидным е...