Llevo unos días repasando tras el curso de programación e intentando acabar ejercicios que no me dio tiempo a hacer.  Uno de ellos es Async U: Game of Thrones StyleHaced clic en el título para leer la descripción completa del ejercicio.

En este ejercicio hay que aprender a leer y formatear un archivo txt como JSON, e imprimirlo en la consola con un formato concreto. El archivo en cuestión contiene un listado de capítulos de Juego de Tronos, cada uno con título, descripción y una puntuación.

En el ejercicio, se pide que se imprima esa puntuación en número, pero también con asteriscos. Es decir, si tiene dos puntos, se imprime **. Si tiene cinco, *****.

Redondeo

La primera cuestión es que la puntuación de los capítulos tiene decimales: 8.5 ó 8.2, por ejemplo. La solución que yo he planteado es redondear.

Creo una variable y guardo en ella la puntuación redondeada. Para redondear, se puede usar Math.round().

Por ejemplo Math.round(8.4) es igual a 8.

La variable que creo se llama rate. Dentro de los paréntesis de Math.round lo que veis es la referencia a la puntuación de cada capítulo. El archivo de los capítulos se llama episodes. He creado un bucle que pasa por cada capítulo. Es decir, a cada pasada de bucle, la [i] busca el primer, el segundo, el tercer capítulo y así hasta acaba el archivo. Para acceder a la puntuación, tengo que añadir .rating. Como igualmente, si quisiera acceder al título, añadiría .title.

var rate = Math.round(episodes[i].rating);

Concatenar n veces un carácter

El siguiente problema es que hay que concatenar varias veces un carácter. La forma más básica de concatenación que hemos aprendido es usar el operador +.

Si sumas dos asteriscos:

x = “*” + “*”

Si imprimes x en la consola:

console.log(x)

El resultado de imprimir x  es:

**

Vale, ¿pero cómo programo para que concatene los asteriscos un número cambiante de veces? Es decir, por cada capítulo tengo una puntuación diferente, ahora redondeada, pero puede ser 3, 8, otras veces 9…

Buscando en internet encontré Array(n).join(). Por ejemplo, si haces:

x= Array(4).join(“a”)

El resultado de imprimir x es:

aaaa

Así que ahora sólo tengo que sustituir el número 4 por la variable en la que he guardado la puntuación redondeada y sustituir la “a” por un asterisco. Puedo guardar todo esto en otra variable:

var stars = Array(rate).join(“*”);

Así que la función quedaría así:

function printEpisodes(episodes){
	for(var i = 0; i < episodes.length; i++){
		var rate = Math.round(episodes[i].rating);
		var stars = Array(rate).join("*");
		console.log("Episode " + episodes[i].episode_number + ": " + episodes[i].title);
		console.log(episodes[i].description);
		console.log("Rating: " + episodes[i].rating + " " + stars);
		console.log("\n");
	}	
}

El resultado en consola:
javascript - math round array join

Sólo he explicado una de las funciones que he hecho para el ejercicio, el código completo está disponible en github.

 

learner-programmerImportante.- Estas son las notas de una persona aprendiendo, no enseñando. Es decir, si vienes aquí en busca de sabiduría, ten en cuenta que llevo poco programando y puedo tener errores.