> Как сравнить массивы аргументов для кеширования в функции memo в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: IT-One, 1221 Systems, Яндекс

Стек: JavaScript

> Пример ответа

Для сравнения массивов аргументов в функции memo можно использовать несколько подходов:

  1. Простое сравнение через JSON.stringify (для примитивов):
JAVASCRIPT
function 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;
};
}
  1. Сравнение по ссылке с помощью Map (для объектов):
JAVASCRIPT
function 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;
};
}
  1. Глубокое сравнение с кастомной функцией (наиболее надежный вариант):
JAVASCRIPT
function 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 - это просто и эффективно для примитивов и простых объектов. Для сложных структур с циклическими ссылками или функциями внутри аргументов потребуется кастомная функция сравнения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью