Samuel Alvarez
José Isidro Torres Caldea
César Palma
Samuel Alvarez
José Isidro Torres Caldea
César Palma
Jose Saúl Guerrero Serrano
Elizabeth Rivera Ura
Juan Jose Hernandez Garcia
Joel Moises Boada Velasquez
Joselo Mantilla
Stephany Plaza
Kevin Alexander Chari Castillo
Alfredo Olmedo
Eduardo Peña Ramos
Rubén Ernesto Aragón Gil
Natalia Ortiz Maldonado
David Hilera
jonathan gonzalez
Jose Nuñez
Jose Saúl Guerrero Serrano
Nicolas Molina
David Saavedra Vázquez
Diego Alejandro Presiga
Gustavo Adolfo Perez Ramos
Diego Rodriguez
Diego Fernando Caviedes Camaho
David Alidhasem Manzanares Casio
Cristobal Nyram
Martín Gutiérrez Hernández
Leoneider Trigos Guerrero
Juan Gui Arenas
Reinaldo Mendoza
Madeliy Ricra Gutierrez
Juan sebastian cardona lopez
Omar Barragán moreno
Miguel Ángel Holguín González
Jeremy Orellana
Stephany Plaza
María Alejandra de los Ángeles
Eduardo Peña Ramos
Angel Vega
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);
Esto aplica cuando trabajamos con vanilla js, los frameworks realizan trabajos de optimización y renderizan de una sola vez en el dom
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);});
genial! no conocia ese metodo insertAdjacentHTML
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>
Con este ejemplo me quedó claro. Gracias
me ayudo un montón, gracias
<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>
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
Así, de hecho prefiero usar Live Server, me parece más práctico.
Gracias, bro. Me salvaste. No me salía en el cliente server.
Extensión Code Runner para VS Code, utilizada por el profesor
¡Gracias!
excelente gracias
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!
Me pasó exactamente lo mismo :(
Vamos a corregirlo en la plataforma!
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.
¡Muchas gracias por tu aporte!
ForEach método útil para recorrer un array y realizar alguna operación sobre cada elemento del mismo
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!
donde puedo ver esto de Node elements ? gracias
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>
Lanzar http-server:
npx http-server client
:O Genial, no sabia lo poderoso que es ForEach
y cortito que es lo mejor
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>
oye, muchas gracias por tu aporte; aclare algo de dudas aprendi algo nuevo y complemente el reto del la clase
¿el foreach es más rapido que el for? cuando se trabaja con un array muuuuy grande cual se deberia usar?
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/
excelente voy a leer ese articulo, gracias
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); } }); }); ``
Me gusta cómo se van acomodando por categorías.
Advice
Pd
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> ` });