Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Desarrollo Web Entorno Cliente - UD2 Practica
Desarrollo Web Entorno Cliente - UD2 Practica
definidas por el
programador-
Práctica guiada
2
01
Gestión del stock de una tienda
Una buena forma de ver cómo se utilizan las funcionalidades
de las colecciones es a través del uso que se hace en un
ejemplo concreto, como puede ser la gestión del stock de
una tienda.
3
El tendero nos ha pedido un listado con todo el stock de sus productos. Para crear un array se ha utilizado la instrucción :
let productos = new Array(10);
Y ésta ha sido nuestra implementación: Con esta instrucción se crea un array inicializado con 10 posiciones,
let productos = new Array(10); pero también podíamos haberlo asignado literalmente:
productos.fill(50) let productos = [];
function verStock(){
let listado = ""; ¿Qué diferencia existe entre las dos formas de crear un array ?
for(let i = 0; i < productos.length; i++){ A priori, parece que son iguales pero no, vea el siguiente ejemplo:
listado += `<li>El producto número ${i} tiene ${productos[i]} let a = [], // éstos son iguales
unidades`; b = new Array(), // aib son arrays con longitud 0
}
document.getElementById("listado").innerHTML=listado; c = ['foo', 'bar'], // éstos también son iguales
} d = new Array('foo', 'bar'), // cid son arrays con dos strings
verStock();
Puede ver este ejemplo en el siguiente enlace: https://codepen.io/EEP- // Aquí está la diferencia:
igroup/pen/qBXKEvR. e = new Array(3), // e.length == 3, e[0] == undefined
f = [3] // f.length == 1, f[0] == 3
El código HTML y CSS utilizado por estos ejemplos se puede encontrar ;
en los enlaces a CodePen.
4
Podemos definir, con el constructor, un array de un tamaño concreto. Sin Fíjese que al método map()se le ha pasado como argumento una
embargo, si utilizamos la asignación literal []para crear arrays , no función de flecha que devuelve un número aleatorio entre 0 y 99:
podemos definir el tamaño inicial. Si añadimos en un array literal un () => Math.floor(Math.random() * 100)
número, éste será el primer elemento del array y no su tamaño. Es importante recordar que la función map()sólo se aplica a los valores
asignados, ya sea mediante el método fill()o asignando los valores
La sintaxis es la siguiente: manualmente.
[elemento0, elemento1, ..., elementoN]
new Array(elemento0, elemento1[, ...[, elementoN]]) La función verStock(), recorre el array productos y muestra por pantalla
new Array(tamaño) la información de cada uno de ellos dentro de la etiqueta con
El array se inicializa con los elementos dados excepto si sólo existe un identificador listado(en el código HTML ).
elemento. En este caso, este elemento simboliza el tamaño del array
sólo si se utiliza la creación del array con la palabra reservada new. Sólo queda ver el funcionamiento de la función verStocl():
function verStock(){
Una vez creado el array lo llenamos con el valor 50: let listado = "";
productos.fill(50) for(let i = 0; i < productos.length; i++){
Con el método se fill()asigna el valor 50 a todos los elementos del array . listado += `<li>El producto número ${i} tiene ${productos[i]}
Cabe destacar que si el array está vacío, invocar este método no tendrá unidades`;
ningún efecto. }
document.getElementById("listado").innerHTML=listado;
Si en lugar de utilizar un valor estático quisiéramos generar los valores }
aleatoriamente, podríamos hacerlo utilizando el método map()para Esta función la invocamos directamente desde JavaScript y es la
crear un nuevo array a partir de una función y asignándolo al array encargada de generar el listado que se visualiza en la pantalla.
productos :
productos = productos.map(() => Math.floor(Math.random() * 100));
Aunque sabemos que sólo hay 10 productos, este número no se ha
Puede ver este ejemplo en el siguiente enlace: https://codepen.io/EEP- utilizado como condición de control. Es mucho más útil acceder a la
igroup/pen/KKvepKO propiedad lengthdel array .
5
Volvemos al ejemplo. La función verStock()utiliza una variable local
llamada listado que se va llenando poco a poco a medida que el bucle
va dando vueltas. En cada vuelta del bucle la variable recoge los datos
del producto en curso. Por último, cuando se llega al final del array , la
variable contiene la información deseada por el usuario.
document.getElementById("listado").innerHTML=listado;
6
02
Ampliación del número
de productos de la
tienda
Queremos ampliar el número de productos de la tienda.
Cada vez que pulsamos un botón, debe ampliarse el
número de productos. Tanto el número de productos como
el stock deben ser aleatorios.
7
let productos = [];
function ampliarStock(){ Hacer refactorización significa, en programación,
let nuevoStock = pedirProductos(); reestructurar el código para mejorarlo y reducir su
complejidad sin cambiar las funcionalidades que habían
productos.push(...nuevoStock);
hasta el momento.
verStock();
} No se han cambiado las funcionalidades, sino que mejor se han
function pedirProductos(num){ aprovechado. De hecho, la función se demanarProductes(num)utiliza
if(arguments.length === 0){ por dos cosas: inicializar el array productos y, además, para pedir
nuevos productos. Echemos un vistazo a la función.
num = Math.floor((Math.random() * 5) + 1);
function pedirProductos(num){
}
if(argumentos.length === 0){
let nuevosProductos = new Array(num);
num = Math.floor((Math.random() * 5) + 1);
nuevosProductos.fill();
}
return nuevosProductos.map(() => Math.floor((Math.random() * 100)))
let nuevosProductos = new Array(num);
}
nuevosProductos.hijo();
productos = pedirProductos(10);
return nousProductes.map(() => Math.floor((Math.random() * 100)))
verStock();
}
Puede ver este ejemplo en el siguiente enlace: https://codepen.io/EEP-
igroup/pen/mdMKJRG La función admite un parámetro llamado num. Este parámetro es
opcional. Si se envía el parámetro creará un array con el número de
productos solicitados. Sin embargo, si no se envía el número de
En este ejemplo se han añadido dos botones al código HTML que
productos que se crearán será aleatorio.
llaman a las funciones verStock()y ampliarStock(). Si observa el código
HTML de los botones, verá que el evento de onclick los botones tiene
asignado los llamamientos a sus respectivas funciones. Esta funcionalidad se logra preguntando el número de parámetros
enviados a la función. En concreto, argument.lengthpodemos saber
<button onclick="verStock()">Ver stock</button>
exactamente el número de parámetros enviados. Si el tamaño es
<button onclick="ampliarStock()">Ampliar stock</button>
1significa que la variable numestá llena y nos piden un array con ese
Observe que se han creado dos nuevas funciones: ampliarStock()y tamaño. En cambio, si el tamaño se 0quiere decir que nos piden un
pedirProductos(num). Esta última función se ha creado para hacer array con un tamaño indeterminado. Este tamaño deberemos calcularlo
refactorización del codigo del código. aleatoriamente.
8
El resto de la función ya es conocido. Sólo se ha cambiado el punto del Para añadir los elementos devueltos hemos utilizado el operador de
código donde se realiza la inicialización y el tamaño inicial, en lugar de propagación …nuevoStock y los hemos añadido mediante el método
crear el array directamente se hace la llamada a pedirProductos()y se push().
asigna como array inicial el retorno de esta función.
Cabe recordar que este método añade uno o más elementos al final de
Entonces, para inicializar el array productos se hace una llamada a esta un array y que estos elementos deben estar separados por comas. Por
función. este motivo se utiliza el operador de propagación, ya que realiza la
productos = pedirProductos(10); conversión de un array a una lista de valores separados por coma.
Puesto que inicialmente se quieren 10 productos, se envía el tamaño del
array deseado a la función. La función creará un array temporal que se El método push añade uno o más elementos al final del array . El array
asignará a la variable productos. original se modifica y aumenta su longitud. También es posible añadir
los elementos al inicio del array con el método unshift .
La función pedirProductos(num)ha sido creada para utilizarla también
en caso de que se quiera ampliar la oferta de productos de la tienda. La sintaxis del método push()es la siguiente:
function ampliarStock(){ array.push(elemento1, ..., elementN)
let nuevoStock = pedirProductos(); Todos los elementos que se pasan como parámetro del método se
productos.push(...nuevoStock); push() añaden al final del array .
verStock();
}} En caso de haber invocado el método pasando como argumento
Para ampliar aleatoriamente tanto el número de productos como el nuevoStock, el resultado habría sido diferente, puesto que, en lugar de
stock utilizaremos la función pedirProductos()sin enviar ningún añadir todos los valores uno a uno, se habría añadido todo el array
parámetro. Si ejecutamos la función sin parámetros, nos devolverá un como un único elemento.
array con las características deseadas.
Una vez tenemos el array con los nuevos productos deben añadirse al
array products .
9
03
Ranking con los productos más
vendidos
11
3.1 Añadir un producto Vemos un ejemplo de utilización de la función unshift():
let productos = ["Legumbres", "Tomate", "Cebolla", "patata"];
Para añadir un producto al catálogo de productos se ha utilizado el let nuevosProductos = ["ajo", "pimiento"];
} igroup/pen/vYJrZmo?editors=1111
12
3.2 Eliminar un producto Vemos ahora el mismo ejemplo pero utilizando shift():
function delProducto() {
function eliminarProducto() { }
Y el código HTML asociado a esta función es el siguiente: demás para que el índice del array siga comenzando por 0. El elemento
eliminado del array se devuelve para poder utilizarlo en el programa si
<button onclick="eliminarProducto()" >Eliminar 1 producto</button>
fuera necesario.
vez de utilizar el método pop(). encontrará casos en los que será interesante llevar a cabo alguna acción
sobre el elemento eliminado o habrá que devolverlo. Por ejemplo, para
notificar al usuario qué elemento ha sido eliminado.
Como puede apreciarse, basta con invocar el método pop()del array
para eliminar el último elemento y seguidamente invocamos la función
verStock()para refrescar los datos en el documento HTML .
13
3.3 Ordenar productos El producto 8 tiene 73 unidades proporcionamos la función que debe utilizar
para realizar la ordenación.
El producto 9 tiene 98 unidades
según stock
Si nos fijamos, para ordenar sólo necesitamos Como puede apreciarse, en este caso se ha
Esta funcionalidad permite ordenar los pasado como argumento del método sort()una
el método sort() que nos proporciona la
productos según su stock. Los productos con función de flecha (éste es un caso de uso muy
biblioteca JavaScript.
poco stock serán los primeros. El código habitual para las funciones de flecha):
asociado a esta funcionalidad es el siguiente:
El método sort(), por defecto, ordena (a, b) => a - b
function ordenarProductos() {
alfabéticamente, es decir, como si todo fuera
productos.sort((a, b) => a - b);
una string . Cuando la función sort()debe comparar dos
verStock(); valores para determinar cuál es mayor, envía
} estos dos valores a la función de comparación y
La sintaxis del método sort()es la siguiente:
El código HTML asociado a esta función es el ésta debe devolver un valor negativo, un cero o
array.sort([funcionComparación])
siguiente: un valor positivo, dependiendo de los
<button onclick="ordenarProductos()" > parámetros.
El método sort()permite ordenar los elementos
Ordenar Productos según el stock que queda
del array . El comportamiento por defecto del
</button> Por ejemplo, si se compara el número 40 y el
método es ordenar los elementos del array
Al utilizar la función ordenarProductes() debe 100, la función sort()llama a la función de
utilizando el código Uni-code de los caracteres
aparecer un listado similar a éste: comparación con los parámetros (40, 100). La
del array a ordenar. Si se desea cambiar este
Listado de productos: función de comparación calcula 40 - 100 y
comportamiento existe la posibilidad de enviar
devuelve -60 (un número negativo).
El producto 0 tiene 6 unidades una función de ordenación como parámetro.
El producto 1 tiene 11 unidades
El método sort() determina que 40 es menor
El producto 2 tiene 35 unidades Por ejemplo, para ordenar números no nos
que 100 y ordenará los valores según esta
El producto 3 tiene 35 unidades interesa este comportamiento: si los números
información.
El producto 4 tiene 51 unidades se ordenan como strings , “25” sería mayor que
“100”, ya que “2” es mayor que “1”.
El producto 5 tiene 58 unidades
El producto 6 tiene 59 unidades
Para solucionar este inconveniente, el método
El producto 7 tiene 70 unidades
sort() permite cambiar su comportamiento si le
14
3.4 Comprar un producto A continuación se muestra la llamada HTML
desde el botón comprar producto. Desde la
valor asociado a la clave numproducto y, en
caso contrario, asignamos 0 a la cantidad: if
página HTML se hace el paso de parámetro con (vendidos.has(numproducto)).
La funcionalidad comprar producto es
el valor que el usuario introduzca en el textbox . ‣ Incrementar en uno la cantidad vendida.
indispensable si queremos realizar un ranking
Este valor debe coincidir con un número de ‣ Asignar el nuevo valor a vendes:
de los productos más vendidos. La
producto válido. vendes.set(numproducto, cantidad);
funcionalidad que se quiere implementar es
<input type="texto" id="numProducto" ‣ Reducimos el número de productos en stock
que el comprador informe sobre el producto
size="10"/> en uno: productos[numproducto]--;.
deseado y que decrezca el número de stock del
producto. En este caso, el comprador debe <button onclick ="comprar ‣ En cualquier caso, se muestra el ranking y se
decir el número de producto que desea (document.getElementById('numProducte').val actualiza el listado de productos por pantalla.
comprar. El código JavaScript asociado a esta ue);" >Comprar Producto</button>
Fíjese que vendidos es un map y no un array,
funcionalidad se puede ver en el siguiente El evento onclick del botón hace la llamada a la así que se trata de una colección desordenada
código: función JavaScript comprar()pero esta función y se añaden los elementos indicando la clave y
function comprar(numproducto) { necesita del número de producto que se desea el valor con el método set(), se recuperan con
comprar. Así, desde la página web se accede al get() y se comprueba si la clave existe con has().
if (productos[numproducte] !== undefined &&
elemento numProducto, que es el textbox que
productos[numproducte] > 0) {
utiliza el usuario para informar del producto
let cantidad = 0 En este caso hemos optado por utilizar un
que desea comprar, y se toma el valor. Este
if (ventas.has(numproducto)) { diccionario de datos porque el orden en el que
valor se envía por parámetro a la función
cantidad = ventas.get(numproducto); se añaden los elementos no es importante y, en
comprar().
caso de que se eliminara algún valor del mapa,
}
no queremos que las claves cambien (lo que
cantidad++; Una vez se realiza la llamada a la función ocurre cuando se elimina un elemento de un
ventas.set(numproducto, cantidad); comprar() ésta debe realizar las siguientes array , ya que los índices de todos los
productos[numproducto]--; acciones: elementos posteriores se actualizan para seguir
ranking(); ‣ Comprobar que el stock del producto se siendo consecutivos).
haya definido y sea superior a 0: if
verEstoque();
(productos[numproducto] !== undefined &&
} La clave vendidos debe coincidir con el índice
productos[numproducto] > 0).
} de productos y, por consiguiente, es más
‣ Comprobar si el producto ya se encuentra en seguro utilizar un mapa.
el mapa vendidos; si es así, recuperamos el
15
Mostrar el ranking de los productos más vendidos El mapa vendidos utiliza su clave como número de producto.
La función que calcula el ranking de los productos más vendidos se
basa en un array en el que están almacenados los productos que ha Es importante remarcar este hecho ya que a la hora de realizar la
comprado el usuario. Este array se va llenando a medida que el usuario ordenación, la función sort()pone en la primera posición del array el
utiliza la función compra(numProducte). mayor número de unidades vendidas y perderemos a qué producto
corresponde.
El código para obtener un ranking ordenado de mayor a menor es el
siguiente: Para generar el ranking de ventas nos encontramos con dos problemas:
function sortProducto(a, b) { ‣ vendidos es un mapa y los mapas no se pueden ordenar.
const aa = a.split("-")[0]; ‣ si lo convertimos en un array y lo ordenamos mediante el método
const bb = b.split("-")[0]; sort(), se pierde la correspondencia “índice-clave” con el array de
return aa - bb; productos, ya que utilizamos el índice de productos cómo
} identificador para cada producto.
function ranking() {
let aux = []; Debemos inventarnos una forma de no perder la referencia al producto.
Por suerte, sabemos que la función de ordenación la podemos cambiar.
for (let [numproducto, cantidad] of vendidos) {
La idea es la siguiente: para no perder la referencia al producto,
aux.push(cantidad + "-" + numproducto);
después de realizar la ordenación, éste debe estar dentro del valor
} junto con las unidades vendidas. Así, podemos crear una cadena de
aux.sort(sortProducto).reverse(); texto en la que una parte de la cadena sean las unidades vendidas y
let listado = ""; otra parte corresponda al producto asociado. Por ejemplo, si tenemos
for (let valor of aux) { 50 unidades vendidas del producto 3, podemos construir una cadena
de texto similar a “50-3”. Y así con todos los productos vendidos.
let [stockProducto, codiProducto] = valor.split("-");
listado += `<li>se ha vendido ${stockProducto} unidades del
producto ${codiProducto}</li>`;
}
document.getElementById("vendidos").innerHTML = listado;
}
16
Aunque en este ejemplo hemos utilizado const para indicar que los
Vea el código utilizado para crear un nuevo array donde guardamos las valores de aa y bb no van a cambiar, esto no es necesario. Se podría
cadenas de texto con el número de unidades vendidas y su producto. haber utilizado let.
for (let [numproducto, cantidad] of vendidos) {
aux.push(cantidad + "-" + numproducto); Todas las funciones de ordenación deben devolver un número positivo
} si el segundo valor es menor, un número negativo si el primer valor es
menor y 0 si son iguales. Para realizar el ranking de los productos más
vendidos se debe comparar las unidades vendidas de dos productos.
Observa que se ha utilizado for…of para recorrer el mapa de vendidos,
En este caso, a tiene la forma unidades-vendidas-de-productoA uy b
desestructurando el elemento, de modo que la clave queda asignada a
tiene la forma unidades-vendidas-de-productoB . Debemos separar las
numproducto y el valor a cantidad.
unidades vendidas del número de producto.
17
18