> Как сравнить массивы аргументов для кеширования в функции memo в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: IT-One, 1221 Systems, Яндекс
Стек: JavaScript
> Пример ответа
Для сравнения массивов аргументов в функции memo можно использовать несколько подходов:
- Простое сравнение через JSON.stringify (для примитивов):
JAVASCRIPTfunction memo(fn) {const cache = new Map();return (...args) => {const key = JSON.stringify(args);if (cache.has(key)) return cache.get(key);const result = fn(...args);cache.set(key, result);return result;};}
- Сравнение по ссылке с помощью Map (для объектов):
JAVASCRIPTfunction memo(fn) {const cache = new Map();return (...args) => {// Используем массив аргументов как ключconst key = args;if (cache.has(key)) return cache.get(key);const result = fn(...args);cache.set(key, result);return result;};}
- Глубокое сравнение с кастомной функцией (наиболее надежный вариант):
JAVASCRIPTfunction memo(fn, compare = (a, b) => JSON.stringify(a) === JSON.stringify(b)) {let lastArgs = null;let lastResult = null;return (...args) => {if (lastArgs && compare(lastArgs, args)) {return lastResult;}lastArgs = args;lastResult = fn(...args);return lastResult;};}
Рекомендация: Для большинства случаев используйте JSON.stringify - это просто и эффективно для примитивов и простых объектов. Для сложных структур с циклическими ссылками или функциями внутри аргументов потребуется кастомная функция сравнения.
> Похожие задачи по frontend
Можно ли изменять массивы и объекты, объявленные через const в JavaScript?
В чем разница между Promise.all и Promise.allSettled в JavaScript?
Можно ли сравнить два объекта в JavaScript и как это сделать
Почему новый объект не изменяет исходный объект при передаче в функцию в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью