Estoy tratando de resolver el siguiente problema: (No es una pregunta de tarea, solo una práctica de entrevista).
Cree una función "fastCache" que tome un argumento (una función) y devuelva una función. Cuando se invoca fastCache, 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.
Pude resolver esto cuando la entrada es solo un argumento. Pero para el siguiente ejemplo, no tengo idea de cómo hacerlo: L
// // MULTIPLE ARGUMENTS CASE const sumMultiplyBy2 = (num1, num2) => 2 * (num1 + num2); const cachedSumMultiplyBy2 = fastCacheMult(sumMultiplyBy2); console.log(cachedSumMultiplyBy2(5, 10)); // -> 30 console.log(cachedSumMultiplyBy2(1, 2)); // -> 6 console.log(cachedSumMultiplyBy2(5, 10)); // -> 30 // from the cache object // */Este es el código que escribí para el caso de argumento único:
const fastCache = (callback) => { const obj = {}; return (input) => { if (input in obj) { console.log("from cache"); console.log(obj); return obj[input]; } else { obj[input] = callback(input); return callback(input); } } } iplyBy2 = num => num * 2; const cachedMultiplyBy2 = fastCache(multiplyBy2); console.log(cachedMultiplyBy2(100)); // -> 200 console.log(cachedMultiplyBy2(150)); // -> 300 console.log(Supongo que esto es lo que estás buscando:
function add(...numbers) { return numbers.reduce((accumulator, current) => { return accumulator += current; }); }; function sumMultiplyBy2(numbers){ return add(numbers) * 2 } sumMultiplyBy2(200) //400 sumMultiplyBy2(100,50) //300Así que traté de unir los argumentos como se sugiere en los comentarios y obtuve un código de trabajo:
const fastCacheMult = (callback) => { const obj = {}; return (...inputs) => { if (inputs.join('') in obj) { console.log("from cache"); return obj[inputs.join('')]; } obj[inputs.join('')] = callback(...inputs); return callback(...inputs); } } const sumMultiplyBy2 = (num1, num2) => 2 * (num1 + num2); const cachedSumMultiplyBy2 = fastCacheMult(sumMultiplyBy2); console.log(cachedSumMultiplyBy2(5, 10)); //30 console.log(cachedSumMultiplyBy2(1, 2)); //6 console.log(cachedSumMultiplyBy2(5, 10)); //30Sin embargo, también descubrí que solo puedo usar el parámetro de descanso y funciona tanto para argumentos únicos como múltiples:
function fastCacheMult(callback) { let obj = {}; return function (...inputs) { if (obj[inputs]) { console.log("from cache"); return obj[inputs]; } obj[inputs] = callback(...inputs); return obj[inputs]; } } const sumMultiplyBy2 = (num1, num2) => 2 * (num1 + num2); const cachedSumMultiplyBy2 = fastCacheMult(sumMultiplyBy2); console.log(cachedSumMultiplyBy2(5, 10)); // -> 30 console.log(cachedSumMultiplyBy2(1, 2)); // -> 6 console.log(cachedSumMultiplyBy2(5, 10)); // -> 30 // from the cache object