Skip to content

Instantly share code, notes, and snippets.

@pointofpresence

pointofpresence/memoize.js

Last active Jan 11, 2021
Embed
What would you like to do?
Created with Copy to Gist
// Приведенная ниже функция memoize() сохраняет результаты каждого вызова принимаемой функции в виде [ключ:значение].
// Функция, генерирующая ключ исходя из параметров
const generateKey = args => (
args.map(x => `${x.toString()}:${typeof(x)}`).join('|') // Результат: "x1:number|x2:number|..."
);
// Принимает функцию в качестве параметра
const memoize = fn => {
const cache = {};
return (...args) => {
// Генерирует ключ для сохранения результата
const key = generateKey(args);
const val = cache[key];
// Проверяет, существует по данному ключу какое-либо значение и возвращает его, если оно есть
if (val) return val;
// Сохраняет результат вызова функции
const res = fn(...args);
cache[key] = res;
// Возвращает результат
return res;
};
};
// С помощью нее мы можем избежать повторного выполнения вычислений в случае, если они уже были произведены.
// Функция, находящая сумму чисел от a до b
const sumSeq = (a, b) => {
console.log('Calculate sum');
let r = 0;
for (let i = a; i < b; i++) r += i;
return r;
};
// Производим мемоизацию функции sumSeq
const mSumSeq = memoize(sumSeq);
console.log('First call mSumSeq(2, 5)');
console.log('Value: ' + mSumSeq(2, 5)); // Выводит в консоль "9"
console.log('Second call mSumSeq(2, 5)');
console.log('From cache: ' + mSumSeq(2, 5)); // Выводит в консоль "9"
console.log('Call mSumSeq(2, 6)');
console.log('Calculated: ' + mSumSeq(2, 6)); // Выводит в консоль "14"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment