JavaScript básico - Colección de discos

Cuéntanos qué está pasando:
Hi everyone!
I’ve tried everything, but clearly without success.
I’m gonna show you my code, I think one of the problem is that I don’t know how to assign Tracks. I could assign out of the function…but I think they want me to put inside the condition.
I’ve seen a lot of codes on internet about this project, but since I don’t necessary understand them, I don’t want copy other’s solutions without understanding what is wrong. Is anyone out there that can explain to me or giving any hints to me?
Not only I’m doing this course but before doing any exercise on Freecodecamp, I study their videos on Youtube and I take notes and think, a lot.
But despite that, I don’t understand. In their video, this exercise is different, now I’m trying to apply logic but since I started to coding just 2 month ago , I don’t even know if I have the knowledge to solve this problem.
Help ¯_( ͡❛ ͜ʖ ͡❛)_/¯ me !
It’s Holy Week and I need to solve this before going on holiday:)

Tu código hasta el momento

// Configuración
const recordCollection = {
  2548: {
    albumTitle: 'Slippery When Wet',
    artist: 'Bon Jovi',
    tracks: ['Let It Rock', 'You Give Love a Bad Name']
  },
  2468: {
    albumTitle: '1999',
    artist: 'Prince',
    tracks: ['1999', 'Little Red Corvette']
  },
  1245: {
    artist: 'Robert Palmer',
    tracks: []
  },
  5439: {
    albumTitle: 'ABBA Gold'
  }
};

// Cambia solo el código debajo de esta línea

function updateRecords(records, id, prop, value) {
  if (prop !== tracks && value !== "") {
  records[id][prop] = value;
} else if (prop === tracks && value !== "") {  
  records[id][prop].push(value);
} else if (value === "") {
  delete records[id][prop];
  }
  return records;
}

updateRecords(recordCollection, 5439, 'artist', 'ABBA');

Información de tu navegador:

El agente de usuario es: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36

Challenge: JavaScript básico - Colección de discos

Enlaza al desafío:

Hola!

Te respondo en español, ya que veo que el link está en español.
Lo tienes casi, no te voy a dar la solución del todo, pero sí las pistas.

El primer fallo está en que estás usando en los “if” el “track” como si fuera una variable y tienes que indicar si la “prop” es diferente del texto “track”.

Para indicar que compare texto tendrás que indicarlo entre comillas => "track"

Después de corregir esto, te encontrarás que hay un caso en que si no existe un Array con alguna pista(track), el “if” donde usas el push no va a poder insertar el nombre de la pista.

Por lo tanto, lo más sencillo es que dentro de esa acción, realices otro “if” y compruebes que si “records[id][prop]” no contiene nada => records[id][prop] = ??? debes añadir un array con el valor(value) en caso contrario, realizas el push que ya tienes.

Y con esto lo tendrías solucionado.

Espero que te sirva de ayuda.

Te recomiendo que uses console.log(y aqui dentro los test) para ver los resultados y qué errores indican, esto te dará pistas de por donde empezar.
Por ejemplo:
console.log(updateRecords(recordCollection, 5439, "tracks", "Take a Chance on Me"))

1 Like

Mil mil gracias por tu ayuda. No he resuelto el acertijo y lo he cambiado de mil formas pero igual gracias. Mañana me sentaré nuevamente y lo volveré a intentar revisando los apuntes. Tal vez esté equivocandome nuevamente en la sintaxis como pasó con los “tracks” a los que no les puse comillas. Gracias!

Solo con arreglar lo de “tracks” y añadiendo el IF dentro del que tienes como te comentaba. El ejercicio pasa seguro.

Está bien que pruebes y te rompas el coco tú misma, pero no dudes en preguntar de nuevo y enseñar el código que estás intentado si no te sale :wink:

Aquí estamos para ayudarnos y aprender, ánimo!

Va te marco con REVISAR y con NUEVO los cambios que te comento por si no queda claro, aun así te dejo trabajo. :slight_smile:

// Configuración
const recordCollection = {
  2548: {
    albumTitle: 'Slippery When Wet',
    artist: 'Bon Jovi',
    tracks: ['Let It Rock', 'You Give Love a Bad Name']
  },
  2468: {
    albumTitle: '1999',
    artist: 'Prince',
    tracks: ['1999', 'Little Red Corvette']
  },
  1245: {
    artist: 'Robert Palmer',
    tracks: []
  },
  5439: {
    albumTitle: 'ABBA Gold'
  }
};

// Cambia solo el código debajo de esta línea

function updateRecords(records, id, prop, value) {
  if (prop !== tracks REVISAR && value !== "") {
  records[id][prop] = value;
} else if (prop === tracks REVISAR  && value !== "") {  
    NUEVA CONDICION
    if (????) {
        records[id][prop] = ????? Debes crear un array con value dentro
    } else {
        records[id][prop].push(value);
    }
} else if (value === "") {
  delete records[id][prop];
  }
  return records;
}

updateRecords(recordCollection, 5439, 'artist', 'ABBA');```
1 Like

Eres muy, pero muy , amable.
Te cuento que al cabo de dos días de intentarlo, terminé pidiendo un hint a Freecodecamp y con él venían tres soluciones que aparecieron como por magia.

Intenté la primera:

else if (prop === “tracks” && value !== “” && records[id].hasOwnProperty(“tracks”) === false) {
records[id][prop] = [value];

Obviamente era correcta y me dejó pasar el proyecto pero sigo sin entenderla y eso me frustra. Así que, si pudieras ayudarme en entender porque no pienso correctamente, sería fantástico.

La consigna que me faltaba resolver era :
Si no hay un “tracks”, no vamos a poder poner un .push(value) porque nos va a dar error. Primero hay que asegurarse el ‘‘tracks’’ y luego empujar el value.

En seguida te copio todos mis intentos y razonamientos:

OPCIÓN 1:

else if ( records[id][prop] === " ") {
records[id][prop] = ;
}
Que en mi cabeza traducía:
Si en el objeto records, los id’s y en las propriedades hay estrictamente un UNDEFINED (o sea, no hay un tracks), entonces le vamos a asignar un espacio (array) para que entre un valor.

OPCIÓN 2:

else if ( records[id][prop] === " ") {
records[id][prop] .push(“Take Chance on Me”);
}

Que en mi cabeza traducía:
Si en el objeto records, los id’s y en las propriedades hay estrictamente un UNDEFINED (o sea, no hay un tracks), entonces vamos a empujar un track específico.

OPCIÓN 3:

else if ( records[id][prop] === " ") {
records[id][prop] = “Take Chance on Me”;
}
Que en mi cabeza traducía:
Si en el objeto records, los id’s y en las propriedades hay estrictamente un UNDEFINED (o sea, no hay un tracks), entonces le vamos a asignar un track específico.

OPCIÓN 4:

else if ( records[id][prop] === " ") {
records[id][prop] = “tracks”;
}

Que en mi cabeza traducía:
Si en el objeto records, los id’s y en las propriedades hay estrictamente un UNDEFINED (o sea, no hay un tracks), entonces lo vamos a crear.

OPCIÓN 5:

else if ( records[id][prop] !== records[id].hasOwnProperty(“tracks”)) {
records[id][prop] = “tracks”;
}

Que en mi cabeza traducía:
Si el objeto records, los id’s y las propriedades no corresponden a: lo mismo+ poseer la propriedad tracks; entonces lo vamos a crear.

ÉSTAS Y MÁS COMBINACIONES FUERON MIS INTERPRETACIONES. AHORA, VOLVAMOS A LA RESPUESTA CORRECTA PARA ANALIZAR LO QUE NO ENTIENDO:

else if (prop === “tracks” && value !== “” && records[id].hasOwnProperty(“tracks”) === false) {
records[id][prop] = [value];

CONDICIÓN:
If
(prop === “tracks”) = no entiendo porque tengo que ponerlo si lo pongo en otro else if después.

(value !== “”) = no entiendo porque tengo que ponerlo si ya lo puse en otro if.

(records[id].hasOwnProperty(“tracks”)=== false) = entiendo que me acerqué a esta sintaxis cuando en la OPCIÓN 5 escribí lo mismo pero en vez de usar FALSE, usé !== (que yo interpreté como un NO ES, es decir, como un falso).

Lo que jamás me hubiera imaginado sería ver las 3 cosas juntas.

NO SÉ SI TENGAS LA PACIENCIA DE LEER ESTO, PERO SI LOGRAS ENTENDER COMO RAZONO Y CORREGIR MI FORMA DE PENSAR, TE LO AGRADECERÍA. Soy docente de italiano, francés y español y manejo el tema sintaxis; sé que quiere decir ver cosas que los demás no ven jeje pero aquí el camino es largo y ando como una ciega.
Enlighten me!

Voy a resumirte bastante, pero principalmente estás asegurando ciertas sintaxis que son incorrectas en todos los casos que no entiendes y ese es el principal problema.

Deberías echar el freno y volver al inicio, revisar como funcionan los condicionales y sus peculiaridades según lo que se está comprobando. (Texto, números, true/false, undefined, Array, etc…)

OPCIÓN 1, 2, 3 y 4
if ( records[id][prop] === "") { Acciones }
Esto NO comprueba si es estrictamente “undefined”.
Esto lo que dice es => Si el contenido existente dentro de “prop” es estrictamente una cadena de texto en blanco, entonces continúa.

La comprobación de “undefined” sería así:
if ( records[id][prop] === undefined) { Acciones }

OPCIÓN 5
if ( records[id][prop] !== records[id].hasOwnProperty("tracks")) { Acciones }
Esto lo que está diciendo es:
Si el contenido existente dentro de “prop” es diferente(!==) de true/false (records[id].hasOwnProperty(“tracks”) ==> de vuelve “true” si existe, “false” si no existe ), entonces continúa.

En este caso se podría utilizar algo como esto:
if ( records[id].hasOwnProperty("tracks")) { Acciones } Esto continuará en caso de “true”.

En cambio, para hacer lo contrario se puede añadir un exclamativo al principio y esto nos dará el resultado contrario:
if ( !records[id].hasOwnProperty("tracks")) { Acciones } En caso de “false”, continúa. (Es decir, si el registro X no contiene una propiedad llamada “tracks” entonces continúa).

El tema de no entiendes por qué o no tienes que volver a repetir algo, simplemente, cuando una condición se cumple y entra dentro, realiza sus aciones en esa condición y acaba la ejecución.
Por lo tanto, si analizas el código verás que para cumplir todas las acciones necesitas comprobar cada caso. Imagínate que cada if es una persona cuadriculada que solo te va a dejar pasar cuando se cumpla estrictamente lo que le pides y además te va a acompañar a la salida del código hasta que vuelvas a empezar otra vez. (Esto no es exactamente así, pero lo digo para este caso en concreto lo entiendas)

Me voy a detener aquí :raised_hand:, la solución que te proponía yo era la más sencilla para entenderlo, a pesar de que yo lo haría distinto.
Parece que no has usado el ejemplo que te daba para acabarlo.

Mi recomendación es que vayas atrás y te lo tomes con más calma todo :face_with_monocle:, además de que empieces a usar console.log() para ver los resultados y errores que te ayudan a entender qué está fallando en tu código e intentes buscar por internet que significan.

Repasa y busca por ejemplo “tipos de datos javascript”, busca vídeos y empápate bien sobre esto, creo que tu principal problema es no acabar de entender bien esto y luego que un if siempre acaba en una comprobación bolean, NO des por hecho nada; prueba, equivócate, investiga y busca y confirma si lo que haces y piensas es como piensas. :eyes: :exploding_head:

Te dejo unos ejemplos de tipos de datos, para que veas que te devuelven:

console.log("Esto es texto:", typeof "");
console.log("Cuando usas comillas, estas usando texto:", typeof "undefined");
console.log("En cambio sin comillas puede ser cualquier cosa", typeof undefined);
console.log("Esto es un array (Tipo objeto):", typeof ["hola"]);
console.log("Esto es un objeto (Tipo objeto):", typeof {textoPrueba: "hola"});
console.log("Esto es un número:", typeof 12345);
console.log("Esto es boleano true", typeof true);
console.log("Esto es boleano false", typeof false);

Paciencia y ánimo :hugs:

Claro! Mil gracias por ser un guía. Empecé en Freecodecamp porque se suponía que me lo explicarían de cero pero me encontraba con 1000 cosas que no entendía y me fui al Youtube de Freecodecamp para entenderlo pero ahora veo que tampoco es suficiente jeje. En mis apuntes tengo 100 cosas más resaltadas para averiguar por separado en tutoriales y paginas web porque no las explican del todo en freecodecamp, o mejor dicho, las hay tal vez, como el link que tu pusiste pero no me mandan ahí a buscarlo. Lo haré. Voy a parar y a tratar de entender todo mejor. Mil gracias!!!

1 Like