Реализация мемоизации в JavaScript

  —  1 минута

#theory#javascript#code#data
Читать статью в Telegram

О том, что такое мемоизация, можно узнать в отдельной статье.

На самом деле, всё это довольно просто. Попробуем написать функцию-обёртку memoize, с помощью которой можно мемоизировать любую другую функцию. Начнём как всегда с интерфейса:

javascript
1function memoize(func) {
2    // ...
3}
4

Наша функция-обёртка будет принимать только целевую функцию, которую мы хотим мемоизировать. В качестве кэша будем использовать Map:

javascript
1const cache = new Map();
2

И далее просто воспользуемся замыканием, чтобы ограничить доступ к созданному кэшу только для целевой функции. Для этого вернем из memoize новую функцию:

javascript
1return 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

Полный код функции:

javascript
1function 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

Статья была полезной?