Lección 13 · 13 de 20
forEach, map y filter · JavaScript
Recorra y transforme arrays en JavaScript sin bucles manuales: forEach para cada elemento, map para crear otro array y filter para quedarse con unos pocos.

Los arrays tienen métodos que reciben una función y la aplican a cada elemento. `forEach()` la ejecuta una vez por producto, con el elemento y su posición (p, i), y no devuelve nada: sirve para hacer algo con cada uno, como escribirlo.
`map()` crea un array nuevo con lo que devuelva la función para cada elemento, del mismo tamaño que el original. products.map((p) => p.name) saca la lista de nombres y el segundo map calcula los precios con IVA.
`filter()` crea un array nuevo solo con los elementos para los que la función devuelve true. p.stock > 0 deja los productos que hay en el almacén y p.price < 50 los baratos.
Como filter y map devuelven arrays, se pueden encadenar: primero se filtran los productos con existencias y de más de 50 euros, y después se les pone el precio rebajado un 10 %. Ninguno de los dos toca el array original, que sigue teniendo sus cinco productos.
Estos métodos con funciones flecha son la forma habitual de trabajar con listas en JavaScript, también para pintar listas de elementos en React.
Código · main.js
const products = [ { name: "Keyboard", price: 45, stock: 12 }, { name: "Mouse", price: 20, stock: 0 }, { name: "Monitor", price: 180, stock: 4 }, { name: "Webcam", price: 60, stock: 0 }, { name: "Headset", price: 75, stock: 7 },];// forEach runs a function for every element (and returns nothing).products.forEach((p, i) => { console.log(`${i + 1}. ${p.name} - ${p.price} euros`);});// map builds a NEW array with one result per element.const names = products.map((p) => p.name);console.log("Names:", names);const withVat = products.map((p) => (p.price * 1.21).toFixed(2));console.log("With VAT:", withVat);// filter keeps only the elements for which the function returns true.const inStock = products.filter((p) => p.stock > 0);console.log("In stock:", inStock.map((p) => p.name));const cheap = products.filter((p) => p.price < 50);console.log("Under 50 euros:", cheap.length, "products");// Chaining: filter first, then map. The original stays the same.const sale = products .filter((p) => p.stock > 0 && p.price > 50) .map((p) => `${p.name} at ${p.price * 0.9}`);console.log("On sale (-10%):", sale);console.log("The original still has", products.length, "products");Salida · node main.js
1. Keyboard - 45 euros 2. Mouse - 20 euros 3. Monitor - 180 euros 4. Webcam - 60 euros 5. Headset - 75 euros Names: [ 'Keyboard', 'Mouse', 'Monitor', 'Webcam', 'Headset' ] With VAT: [ '54.45', '24.20', '217.80', '72.60', '90.75' ] In stock: [ 'Keyboard', 'Monitor', 'Headset' ] Under 50 euros: 2 products On sale (-10%): [ 'Monitor at 162', 'Headset at 67.5' ] The original still has 5 products
Para recordar
forEachhace algo con cada elemento y no devuelve nada.mapdevuelve un array nuevo transformado, del mismo tamaño.filterdevuelve un array nuevo con los que cumplen la condición.- Se pueden encadenar:
.filter(...).map(...). - El array original no cambia.
Ejercicio
Con filter y map, obtenga los nombres en mayúsculas de los productos de menos de 100 euros, y con forEach escriba los que están agotados.