Estoy tratando de crear una función que rastree cuántas horas se dedican a pasatiempos. La entrada es una serie de aficiones. Estoy tratando de crear un objeto de caché con cada pasatiempo como clave y horas dedicadas como valores. Estoy tratando de usar una función de retorno que toma como parámetros una cadena que representa el pasatiempo y un número entero que representa cuántas horas se practicó.
Estoy tratando de hacer que la función de retorno actualice el objeto de caché agregando el valor del entero pasado al caché en la clave correspondiente con el pasado en 'hobby'. Quiero que la función devuelta restablezca todos los valores en el objeto de caché a cero si no se pasan argumentos a la función de devolución.
Esto es lo que he probado hasta ahora...
function hobbyTracker(hobbies) { const cache = {}; return function(hobbies, hours) { if (hobbies) { cache[hobbies] += hours; return cache; } else { for (let key in cache) { cache[key] = 0; } return 'tracker has been reset!'; } } return cache; }No estoy seguro de cómo escribir la declaración 'if' para verificar si se han pasado argumentos o no. No creo que .hasOwnProptery() funcione aquí, ¿verdad? ¡Mi línea de pensamiento es porque funciona en las claves tal como lo entiendo y además el objeto aún no está poblado!
¡Tampoco estoy seguro de dónde debo inicializar el objeto de caché! ¿Es eso parte del problema con mi código?
También sé que mi función de retorno no actualiza correctamente las horas. Lo necesito para acumular el total de horas dedicadas, pero en cambio, mi código simplemente lo sobrescribe con una nueva entrada. Intenté usar += en caché [pasatiempos] = horas, pero luego aparece un objeto poblado por NaN.
¡Cualquier ayuda sería muy apreciada!
Puede utilizar los arguments de objetos especiales. Es un objeto similar a una matriz que contiene todos los argumentos. Si no se pasaron argumentos, su longitud será 0 .
if (arguments.length = 2) { // use hobbies and hours } else { // reset cache }Su declaración if está bien. Si se proporciona hobby , haga algo, de lo contrario, borre el cache . Olvidó agregar un cheque para el pasatiempo que falta en el caché (primera vez), por lo que no tiene que agregar, pero cree la clave en el cache y asigne las hours .
El código final podría ser algo como lo siguiente:
function hobbyTracker() { const cache = {}; return function(hobby, hours) { if (hobby) { if (cache[hobby]) { cache[hobby] += hours; } else { cache[hobby] = hours; } } else { Object.keys(cache).forEach((key) => { cache[key] = 0 }) } return cache; } } const myHobbyTracker = hobbyTracker(); console.log(myHobbyTracker('ski', 8)) console.log(myHobbyTracker('basket', 5)) console.log(myHobbyTracker('ski', 3)) console.log(myHobbyTracker())cache .cache , aunque su ciclo for funciona bien (simplemente no soy un gran admirador).hobbies renombrado como hobby , ya que proporciona una a la vez.¡Tampoco estoy seguro de dónde debo inicializar el objeto de caché!
El uso del alcance de la función hobbyTracker para inicializar el objeto de caché parece razonable, por lo que puede hacerlo privado y accesible desde la función devuelta.