Estaba intentando un algoritmo con el siguiente mensaje:
Defina una función
fastCache
que tome un argumento, una función y devuelva una función. Cuando se invocafastCache
, crea un objeto que rastrea las llamadas a la función devuelta, donde cada entrada a la función devuelta se asocia con su salida. Cada llamada posterior a esa función devuelta con el mismo argumento devolverá la salida directamente desde el objeto, en lugar de volver a invocar la función original. EscribafastCache
para que pueda manejar la entrada de objetos o matrices, y cualquier cantidad de argumentos.
A continuación se muestra la solución a esto con un objeto que usa JSON.stringify en las claves de objeto para almacenar objetos como claves:
const fastCache = (func) => { const cache = {}; return (...args) => { if (cache.hasOwnProperty(JSON.stringify(args))) return cache[JSON.stringify(args)]; cache[JSON.stringify(args)] = func(...args); return cache[JSON.stringify(args)]; }; };
Esta solución tiene sentido para mí ya que estamos pasando valores como claves para el objeto y luego devolviendo el valor respectivo de esa clave. Intenté escribir una solución a este problema usando un mapa JS y no tengo claro por qué mi solución a continuación no funciona de la misma manera que la solución anterior:
const fastCache = (func) => { const cache = new Map(); return (...args) => { if (cache.has(args)) return cache.get(args); cache.set(args, func(...args)); return cache.get(args); }; };
Esta función termina agregando varias claves al Mapa con la misma clave cuando los objetos se pasan como claves en sucesivas llamadas de función para el mismo objeto que se pasa como argumento. Tengo entendido que esto se debe a que los objetos se pasan por referencia en lugar de las cadenas que se pasan por valor, pero dado eso, me cuesta entender los beneficios de un Mapa sobre un Objeto si un get/set no coincide con diferentes referencias de objetos. . ¿Se usa un mapa solo cuando estamos pasando la misma referencia a un objeto frente a un objeto para cuando necesitamos hacer verificaciones en el mismo valor? Esto parece contradictorio con el propósito de un Mapa en JS. Cualquier aclaración sobre cuándo se prefiere un Mapa sobre un objeto y viceversa sería muy apreciada. Gracias.