JavaScript - Error en JS al devolver datos ingresados por el usuario

 
Vista:
sin imagen de perfil

Error en JS al devolver datos ingresados por el usuario

Publicado por Mariana (10 intervenciones) el 04/11/2022 22:42:39
Hola! Estoy intentando resolver un ejercicio que le pide al usuario cargar datos de discos: al darle click al botón Cargar discos con onclick se le pedirá:

- el nombre del disco,
- autor o banda,
- código único del disco,
- nombre de pista y su duración medida en segundos. Si la duración es igual o mayor a 180 segundos, al imprimirse el número deberá pintarse en color rojo.

El usuario puede ingresar la cantidad de pistas que quiera y cuando ya no quiera seguir cargando, se le preguntará si quiere cargar otro disco. Después al darle al botón Mostrar discos el programa va a devolver todos los datos que se ingresaron.
El programa me está funcionando bien hasta la parte que devuelve los nombres de las pistas y su duración. Es decir, supongamos que cargo un disco de Queen con dos canciones y después cargo uno de Coldplay con 2 canciones. Al mostrar los datos se ven 4 canciones: en Queen tengo las propias más las de Coldplay y viceversa. Se están pisando los datos.

La pregunta sería: qué cosa debería modificar en las funciones cargarDatosDelDisco y en mostrarDiscosCargados para corregir ése error? Y cómo puedo hacer que la duración de 180 para arriba aparezca en rojo al imprimirse?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
class DatosDelDisco {
    constructor(nombre, autor, codigo) {
 
        this.nombre = nombre,
            this.autor = autor,
            this.codigo = codigo;
    }
 
    // pistas guardará el nombre y la duración de cada canción
 
    pistas = [];
 
}
 
let todasLasPistas = [];
 
const pedirPista = () => {
 
    let nombrePista = "";
    let duracionPista;
 
    do {
 
        nombrePista = pedirDato("Ingrese el nombre de la pista");
        duracionPista = cargarDuracionDelDisco();
 
 
            todasLasPistas.push ({
                nombre: nombrePista,
                duracion: duracionPista
 
            })
 
    } while (confirm("Desea cargar otra pista?"))
 
    return todasLasPistas;
}
 
const cargarDuracionDelDisco = () => {
 
    let segundos = parseInt(prompt("Ingrese la duración de la pista medida en segundos"));
 
    return segundos;
}
 
// Array donde se guardarán los discos a medida que son cargados
 
let discos = [];
 
// Variables a llenar al cargar los datos
 
let nombre = "";
let autor = "";
let codigo;
let pistas;
 
// Función para cargar los datos del disco al darle click al botón Cargar
 
function cargarDatosDelDisco() {
 
    do {
 
        nombre = pedirDato("Ingrese el nombre del disco");
        autor = pedirDato("Ingrese el autor del disco");
        codigo = cargarCodigoDelDisco();
        pistas = pedirPista();
 
 
        discos.push({
 
            nombre: nombre,
            autor: autor,
            codigo: codigo,
            pista: pistas // VER: CREO QUE EL ERROR PODRÍA ESTAR ACÁ
 
        });
 
    }
 
    while (confirm("Desea cargar otro disco?"))
 
}
 
 
function mostrarDiscosCargados() {
 
 
    let html = "";
 
    discos.forEach( disco => {
 
        html += `<ul>
    <li>Nombre del disco: <strong> ${disco.nombre} </strong> </li>
    <li>Autor/ banda: <strong> ${disco.autor} </strong> </li>
    <li>Código único del disco: <strong> ${disco.codigo} </strong> </li>
    <div>
    <ul>Lista de pistas y duración: ${disco.pista.map(pistas => {
 
// QUÉ ESTÁ MAL ACÁ QUE HACE QUE SE PISEN LOS DATOS EN LAS PISTAS CARGADAS EN CADA DISCO?
 
// CARGO 2 DISCOS CON 2 CANCIONES C/U Y AL IMPRIMIR APARECEN 4 CANCIONES POR CADA DISCO (2 DEL DISCO CORRECTO Y 2 QUE NO CORRESPONDEN)
 
        return `<li> <strong> ${pistas.nombre}</strong>: <span class= "highlight__red"> ${pistas.duracion} </span> segundos</li> `
 
    })}
 
    </ul>
    <div>
   </ul>`;
 
    })
 
    document.getElementById("coleccion").innerHTML = html;
}
 
 
Saludos y muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 40
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Error en JS al devolver datos ingresados por el usuario

Publicado por Marlon (90 intervenciones) el 05/11/2022 00:33:25
Hola, puedes poner el codigo completo el html ? hay una funcion que se llama pedirDato que no esta definida, podrias explicar mas?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Error en JS al devolver datos ingresados por el usuario

Publicado por Mariana (10 intervenciones) el 05/11/2022 01:19:52
Hola! Sí, claro!

class DatosDelDisco {
constructor(nombre, autor, codigo) {

this.nombre = nombre,
this.autor = autor,
this.codigo = codigo;
}


pistas = [];

}

let mensajeDeAlerta = "";


// 1) SOLICITAR NOMBRE DEL DISCO
// 2) PEDIR AUTOR DEL DISCO

const pedirDato = (mensaje) => {

// La variable valor se reutilizará en cada dato string solicitado en el programa

let valor = prompt(mensaje);

return valor;
}

}

// 3) PEDIR CÓDIGO DEL DISCO

// Array donde se guardarán los códigos de los discos para después hacer la verificación de código repetido

let listaDeCodigos = [];

const cargarCodigoDelDisco = () => {

codigo = parseInt(prompt("Ingrese el código del disco"));

// Validación para que el código ingresado esté en rango ni sea otro dato que no sea un número

if (codigo <= 0 || codigo > 999 || isNaN(codigo)) {

mensajeDeAlerta = alert("El código no puede ser menor a 1 ni mayor a 999. Por favor ingrese un código válido");

// Se volverá a pedir al usuario que ingrese de nuevo el código

return cargarCodigoDelDisco();

// sino, el dato se verificará para no estar repetido

} else {

// VERIFICAR SI EL CÓDIGO YA FUE CARGADO ANTES

const codigoUnico = listaDeCodigos.find((codigoUnico) => codigoUnico == codigo);

while (codigoUnico) {

mensajeDeAlerta = alert("Código ya existente. Por favor ingrese un dato válido");

return cargarCodigoDelDisco();

}

// y después se va a cargar al array

listaDeCodigos.push(codigo);

return codigo;
}

}

// 4) PEDIR EL NOMBRE DE LA PISTA

// Array donde se guardarán todas las pistas de cada disco

let todasLasPistas = [];

const pedirPista = () => {

// Declaro las variables donde se guardarán los datos solicitados

let nombrePista = "";
let duracionPista;

do {

nombrePista = pedirDato("Ingrese el nombre de la pista");

// Validación del dato ingresado

if (nombrePista == "") {

mensajeDeAlerta = alert("Este campo no puede quedar vacío. Por favor ingrese un dato válido");

return pedirPista();

} else {

// 5) PEDIR DURACIÓN DE LA PISTA

duracionPista = cargarDuracionDelDisco();

// En el array vacío todasLasPistas se guardarán el nombre y la duración de cada pista

todasLasPistas.push({
nombre: nombrePista,
duracion: duracionPista

})

}

}
// 6) PREGUNTAR AL USUARIO SI DESEA CARGAR OTRA PISTA

while (confirm("Desea cargar otra pista?"))

return todasLasPistas;
}

const cargarDuracionDelDisco = () => {
let segundos = parseInt(prompt("Ingrese la duración de la pista medida en segundos"));

// Validación de la duración de la pista

if (segundos <= 0 || segundos > 7200 || isNaN(segundos)) {

mensajeDeAlerta = alert("La cantidad de segundos no puede ser menor o igual a 0 ni mayor a 7200. Por favor ingrese un código
válido");

// Se volverá a pedir al usuario que ingrese de nuevo el código
return cargarDuracionDelDisco();
}

return segundos;
}

// Array donde se guardarán los discos a medida que son cargados

let discos = [];

// Variables a llenar al cargar los datos

let nombre = "";
let autor = "";
let codigo;
let pista;

// Función para cargar los datos del disco al darle click al botón Cargar

function cargarDatosDelDisco() {

do {

nombre = pedirDato("Ingrese el nombre del disco");
autor = pedirDato("Ingrese el autor del disco");
codigo = cargarCodigoDelDisco();
pista = pedirPista();
console.log(todasLasPistas);

discos.push({

nombre: nombre,
autor: autor,
codigo: codigo,
pistas: pista

});

}


// Preguntar al usuario si desea cargar un nuevo disco

while (confirm("Desea cargar otro disco?"))

}


function mostrarDiscosCargados() {


let html = "";

discos.forEach( disco => {

html += `<ul>
<li>Nombre del disco: <strong> ${disco.nombre} </strong> </li>
<li>Autor/ banda: <strong> ${disco.autor} </strong> </li>
<li>Código único del disco: <strong> ${disco.codigo} </strong> </li>
<div>
<ul>Lista de pistas y duración: ${disco.pistas.map (pista => {
return `<li> <strong> ${pista.nombre}</strong>: <span class= "highlight__red"> ${pista.duracion} </span> segundos</li>
`

})}

</ul>
<div>
</ul>`;

})

document.getElementById("coleccion").innerHTML = html;
}

Saludos y gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 40
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

Error en JS al devolver datos ingresados por el usuario

Publicado por Marlon (90 intervenciones) el 05/11/2022 05:13:40
Tu error es que estas retornando todas las pistas guardadas en la variable "todasLasPistas", lo que podrías hacer es definir esa variable dentro de tu función "pedirPista" y no como una variable global para que se reinicie cada que esa función es llamada. De esa forma cada pista quedaría con cada disco.

Espero te funcione, Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Error en JS al devolver datos ingresados por el usuario

Publicado por Mariana (10 intervenciones) el 07/11/2022 00:07:10
Muchas gracias! Pude solucionarlo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar