Samuel Alvarez
José Isidro Torres Caldea
César Palma
Esto aplica cuando trabajamos con vanilla js, los frameworks realizan trabajos de optimización y renderizan de una sola vez en el dom
El método forEach de los arrays consiste en ejecutar una función (callback) para cada uno de los elementos iterados. Iterar significa repetir una acción varias veces.
Este método recibe dos argumentos:
this en la función. Si se lo omite, será undefined. Recuerde que this en arrow functions es el objeto global.array.forEach(function(), thisArg)
La función, que recibe como argumento el método forEach, utiliza tres parámetros opcionales:
0, y así sucesivamente.array.forEach(function(element, index, array))
Diferencia entre la estructura for y el método forEach
Los métodos de arrays nos permiten realizar algoritmos con una menor cantidad de líneas que una estructura for, con un resultado igual o parecido.
const letters=['a','b','c'] // Utilizando la estructura repetitiva for for(let index=0; index<letters.length; index++){ const element=letters[index] console.log('for',element) } // Utilizando el método forEach letters.forEach(item => console.log('forEach',item))
Mostrar elementos de un array al usuario
Ahora que ya conoces cómo funciona el método forEach, utilízalo para agregar elementos al HTML y así que el usuario lo mire.
Por ejemplo, en un archivo HTML agrega una etiqueta div con un id app, que nos servirá para agregar nuestros elementos.
<div id="app"></div>
Después crea la lógica en un archivo de JavaScript.
const products = [ { title: 'Burger', price: 121 }, { title: 'Pizza', price: 20 }, { title: 'Soda', price: 5 }, ] const app = document.getElementById('app') products.forEach(product => { app.innerHTML += `<li>${product.title} -$ ${product.price}</li>` })
Y listo, en pantalla aparecerán los elementos del array products con su título y precio. Revisa el resultado en este codi.link.
Ejercicio utilizando la función forEach
Crea una lista de tareas, a partir de un array que contenga el título y el estado (completado o no) y muéstralos en un archivo HTML. Puedes utilizar un input de tipo checkbox para indicar el estado de la tarea. ¡Comparte tu trabajo en la sección de aportes!
Contribución creada por: Andrés Guano.
Samuel Alvarez
José Isidro Torres Caldea
César Palma
Esto aplica cuando trabajamos con vanilla js, los frameworks realizan trabajos de optimización y renderizan de una sola vez en el dom
Jose Saúl Guerrero Serrano
Elizabeth Rivera Ura
genial! no conocia ese metodo insertAdjacentHTML
Juan Jose Hernandez Garcia
jajaja muy a lo react
Soy novato en Js vanilla pero solucione así
<script> const tasks = [ { task: 'Tarea 1', descp: 'Descripcion de la tarea 1', done: false, }, { task: 'Tarea 2', descp: 'Descripcion de la tarea 2', done: true, }, { task: 'Tarea 3', descp: 'Descripcion de la tarea 3', done: false, }, { task: 'Tarea 4', descp: 'Descripcion de la tarea 4', done: true, }, ]; const app = document.getElementById('app'); tasks.forEach(task => { app.innerHTML += ` <li> Nombre: ${task.task} || Descripción: ${task.descp} - <input type="checkbox" ${task.done ? 'checked' : ''}/> </li>` }); </script>
Kevin Alexander Chari Castillo
Alfredo Olmedo
Desde Visual Studio Code, tambien se puede utilizar la extension de Live Server de Ritwick Dey para usarla como servidor y ver pintado el codigo en HTML
Eduardo Peña Ramos
Así, de hecho prefiero usar Live Server, me parece más práctico.
Rubén Ernesto Aragón Gil
Gracias, bro. Me salvaste. No me salía en el cliente server.
Natalia Ortiz Maldonado
Extensión Code Runner para VS Code, utilizada por el profesor
David Hilera
¡Gracias!
jonathan gonzalez
excelente gracias
Jose Nuñez
En el examen de este curso viene una pregunta que dice ¿El método forEach es el recomendado para filtrar elementos de un array? Y yo elegí Falso porque yo pensaría que el correcto para este propósito es el método filter, pero me la pusieron como respuesta incorrecta, No me quedo claro.
Saludos!
Jose Saúl Guerrero Serrano
Me pasó exactamente lo mismo :(
Nicolas Molina
ProfesorVamos a corregirlo en la plataforma!
David Saavedra Vázquez
Mejor que el live-server de VS Code y más fácil que usar npx http-server puedes instalar el paquete live-server de npm. Si ya tienes instalado node y npm puedes instalar este paquete globalmente con la siguiente línea:
npm install -g live-server
Entonces solamente es cuestión de que pongas este comando para correrlo:
live-server
Listo, ahora se te abrirá en el navegador.
Diego Alejandro Presiga
¡Muchas gracias por tu aporte!
Gustavo Adolfo Perez Ramos
ForEach método útil para recorrer un array y realizar alguna operación sobre cada elemento del mismo
Diego Rodriguez
Esta es mi solución, lo hice agregando Node elements al dom en vez de hacerlo con InnerHTML, ya que me parece mas cool, aunque alargue un poco el código!
Diego Fernando Caviedes Camaho
donde puedo ver esto de Node elements ? gracias
David Alidhasem Manzanares Casio
Cristobal Nyram
Martín Gutiérrez Hernández
!aplicación toDo Le agrege algo CSS y por lo tanto en el cliclo forEach tuve que poner más código para crear más elementos en el DOM, aunque me faltó investigar como marcar los inputs como terminados.
Leoneider Trigos Guerrero
Lanzar http-server:
npx http-server client
Juan Gui Arenas
:O Genial, no sabia lo poderoso que es ForEach
Reinaldo Mendoza
y cortito que es lo mejor
Madeliy Ricra Gutierrez
Juan sebastian cardona lopez
oye, muchas gracias por tu aporte; aclare algo de dudas aprendi algo nuevo y complemente el reto del la clase
Omar Barragán moreno
Miguel Ángel Holguín González
¿el foreach es más rapido que el for? cuando se trabaja con un array muuuuy grande cual se deberia usar?
Jeremy Orellana
En realidad no, el for normal es más rapido que el forEach y otras formas de iterar como for of o map. Aún así en la mayoría de veces el rendimiento no afecta y es preferible algo que sea mas fácil de entender a que sea más rápido.
Este artículo explica a fondo las diferencias de rendimiento entre distintas maneras de iterar un array:
https://leanylabs.com/blog/js-forEach-map-reduce-vs-for-for_of/
Stephany Plaza
excelente voy a leer ese articulo, gracias
María Alejandra de los Ángeles
Eduardo Peña Ramos
Me gusta cómo se van acomodando por categorías.
Angel Vega
Advice
Pd
Gonzalo Palacios
Tip
En el curso de Manipulación del DOM el profesor nos dice lo malo que es para el performance hacer muchas llamadas al DOM por lo que si quieres mejorar esto un poco, podrias:
En lugar de insertar en cada llamado al HTML, los almacenamos todos en un array
const nodes = []
y luego en cada llamado lo añadimos al array
tasks.forEach(({ title, done }) => { const element = ` <li> <input type='checkbox' id='${title}' name='${title}' ${done && 'checked'} /> <label for='${title}' >${title} </label> </li>`; nodes.append(element)
por último añadimos todo el array al DOM
app.append(nodes)
De esta forma reducimos la cantidad de inserciones al DOM, y mejoramos el performance un poco :)
Dato curioso
para que la casilla aparezca seleccionada se usa (en mi caso) ${tarea.estado==='Terminada' && 'checked'} y esto sucede porque se hace una comparación lógica con el operador &&, este operador en Javascript es peculiar (como muchas otras cosas) porque no funciona como en otros lenguajes que normalmente esperan tipos de datos o expresiones que retornen booleanos. Trabaja de la siguiente manera:
Dada la comparación expr1 && expr2 Devuelve expr1 si se puede convertir a false; de lo contrario, devuelve expr2. Por lo tanto, cuando se usa con valores booleanos, && devuelve true si ambos operandos son true; de lo contrario, devuelve false.
Es por eso que cuando el estado de la tarea es "Terminada" me retorna el valor del lado derecho, es decir, checked. Cuando el valor del lado izquierdo me retorna false, automáticamente toda la expresión me retorna este valor y en el archivo HTML quedará algo como esto <input type="checkbox" id="Facturar" name="Facturar" false> , lo pueden comprobar en el navegador; para que no quede ese false (que personalmente no me agrada), también podemos usar el operador ternario ${tarea.estado==='Terminada' ? 'checked': ''}
Excelente tip, Samuel, hice mi ejercicio basándome en él.
const tareas = [{name:"Licitar", estado:"Terminada"},{name:"Facturar", estado:"pendiente"}, {name:"Revisar correo", estado:"Terminada"}]; function verTareas() { let tareasTotales = ``; tareas.forEach((tarea) => { tareasTotales += `<input type='checkbox' id='${tarea.name}' name='${tarea.name}' ${tarea.estado==='Terminada' && 'checked'} /> <label for='${tarea.name}' >${tarea.name} </label> <br>`; }); return tareasTotales; } const obtenerTareas = verTareas(tareas); const imprimirTareas = document.getElementById("mostrarTareas"); imprimirTareas.insertAdjacentHTML("beforeend", obtenerTareas);
Hola! aquí dejo mi solución al reto propuesto :D
const app = document.getElementById('app'); const tasks = [ { title: 'make dinner', done: false }, { title: 'sweep the floor', done: true }, { title: 'feed the kittens', done: true }, { title: 'buy groceries', done: false }, { title: 'take a bath', done: true }, ]; tasks.forEach(({ title, done }) => { const element = ` <li> <input type='checkbox' id='${title}' name='${title}' ${done && 'checked'} /> <label for='${title}' >${title} </label> </li>`; app.insertAdjacentHTML('beforeend', element);});
<body> <div id="app"></div> <script> const works = [ {title: 'Design logo', status: 'Complete'}, {title: 'Develop head', status: 'Incomplete'}, {title: 'Develop Main', status: 'Complete'}, {title: 'Develop Footer', status: 'Incomplete'}, ]; const app = document.getElementById('app'); works.forEach(work => { app.innerHTML += `<li >${work.title} - ${work.status} <input type="checkbox"> </li>`; }); </script> </body>
Mi solución al reto : )
.
Hice un array con tareas, las cuales tiene un título y pueden estarn completas o incompletas . Si están completas se renderizan con un "checked input" y si no se presentan con la casilla aún vacía.
.
<div id="app"> </div> <script> let tasks = [ {title: "Estudiar cálculo", done: false}, {title: "Estudiar JavaScript", done: true}, {title: "Estudiar inglés", done: true}, {title: "Hacer ejercicio", done: false} ] tasks.forEach(task => { if(task.done == true) { app.innerHTML += `<p> <input type="checkbox" name="${task.title}" checked> <label for="${task.title}">${task.title}</label> <\p>` } else { app.innerHTML += `<p> <input type="checkbox" name="${task.title}"> <label for="${task.title}">${task.title}</label> <\p>` } }); </script>
Mi solución del reto 😊
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Manipulación de arrays</title> <style> @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300&display=swap'); * { padding: 0; margin: 0; list-style: none; text-decoration: none; font-family: 'Montserrat', sans-serif; } h2 { text-align: center; margin-bottom: 10px; } .list { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; justify-content: center; align-items: center; margin: auto; width: 700px; margin-bottom: 20px; } .list>li { align-self: center; border: 1px solid gray; padding: 5px 10px; border-radius: 5px; text-transform: capitalize; } .list>li h4 { margin: 5px 0; } .list>li img { width: 100px; height: 100px; } .list>li span { font-size: 10px; font-weight: bold; background-color: gainsboro; padding: 2px 5px; border-radius: 5px; } .list>li p { display: flex; justify-content: space-between; font-size: 14px; } </style> </head> <body> <h3>Lista de frutas</h3> <ul id="app" class="list"> </ul> <h3>Lista de tareas</h3> <ul id="tasks" class="list"> </ul> </body> <script> const products = [ { id: 1, name: "platano", stock: 10, price: 2.0, image: "https://i.ibb.co/7bC8szm/platano.png", category: { id: 1, name: "frutas frescas", image: "https://i.ibb.co/BqWwTkD/categoria-fruta.webp", }, }, { id: 2, name: "fresa", stock: 10, price: 5.0, image: "https://i.ibb.co/hKNwfmP/fresa.png", category: { id: 1, name: "frutas frescas", image: "https://i.ibb.co/BqWwTkD/categoria-fruta.webp", }, }, { id: 3, name: "mandarina", stock: 10, price: 3.5, image: "https://i.ibb.co/7bC8szm/platano.png", category: { id: 1, name: "frutas frescas", image: "https://i.ibb.co/M2Pt0xX/mandarina.png", }, }, ]; const tasks = [ { id: 1, name: "Comprar frutas", completed: false, }, { id: 2, name: "Comprar verduras", completed: false, }, { id: 3, name: "Comprar carne", completed: true, }, ]; const formatoSoles = (monto) => { let formatoSoles = new Intl.NumberFormat('es-PE', { style: 'currency', currency: 'PEN', }); return formatoSoles.format(monto); }; const app = document.getElementById('app'); products.forEach((item) => { const list = document.createElement('li'); list.innerHTML += ` <span>${item.category.name}</span> <h5>${item.name}</h5> <p> <label>${formatoSoles(item.price)}</label> <label>${item.stock} productos</label> </p> <img src="${item.image}" alt="${item.name}"> `; app.appendChild(list); }); const task = document.getElementById('tasks'); tasks.forEach((item) => { const list = document.createElement('li'); list.innerHTML += ` <label for="task"> ${item.name}</label><br> `; const checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.id = 'completed'; checkbox.name = 'task'; checkbox.checked = item.completed; list.insertAdjacentElement('afterbegin', checkbox); task.appendChild(list); }); </script> </html>
Mi aporte :)
code:
<div id="root"></div> <h3>Tareas Completadas</h3> <ul id="list"></ul> <script src="./src/index.js" type="module"></script> </body>
const ELEMENT = [ { name: "tarea", value: "Limpieza", id: 1 }, { name: "tarea", value: "Leer", id: 2 }, { name: "tarea", value: "Salir a caminar", id: 3 }, { name: "tarea", value: "Desayunar", id: 4 }, ]; ELEMENT.forEach(({ value, name, id }) => { document.getElementById("root").innerHTML += ` <input type="checkbox" value=${value} name="${name}" id="${id}">${value} `; }); ELEMENT.forEach((list) => { const taskId = document.getElementById(list.id); taskId.addEventListener("click", () => { if (taskId.checked) { document.getElementById("list").innerHTML += ` <li id="text${taskId.id}" name="${taskId.name}"> ${taskId.value}: Completada </li> `; } if (!taskId.checked) { const rm = document.getElementById(`text${taskId.id}`); rm.parentNode.removeChild(rm); } }); }); ``
Reto completado:
// reto: renderizar una lista de tareas con forEach const reto = document.getElementById('reto'); const tasks = [{ task: '10 minutos de lectura', status: 'completed', repeat: true }, { task: 'tomar curso de intro a node.js', status: 'ongoing', repeat: false }, { task: 'hacer reto de forEach', status: 'completed', repeat: false }, { task: 'bañar al perro', status: 'incompleted', repeat: true }, { task: 'bañarme', status: 'incompleted', repeat: true } ]; tasks.forEach(t => { reto.innerHTML += ` <div> <input type="checkbox" id="${t.task}" name="${t.task}"> <label for="${t.task}">${t.task} | status: ${t.status} | ¿se repite?: ${t.repeat}</label> </div> ` });