Elige según lo que necesites obtener: forEach y for...of para ejecutar acciones, map para transformar, filter para seleccionar y reduce para resumir en un valor. La confusión más habitual es usar map o forEach para algo que corresponde a otro.
Resumen en una tabla
| Quiero... | Usa | Devuelve |
|---|---|---|
| Hacer algo con cada elemento (mostrar, guardar) | forEach o for...of | undefined |
| Crear una lista transformada del mismo tamaño | map | Array nuevo |
| Quedarme con los que cumplen una condición | filter | Array nuevo |
| Encontrar el primero que cumple | find | Un elemento o undefined |
| Obtener un solo resultado (suma, objeto...) | reduce | Cualquier valor |
| Parar antes de terminar | for, for...of, some, find | — |
forEach: ejecutar una acción
const tareas = ['Leer', 'Practicar'];
tareas.forEach(tarea => console.log('Pendiente:', tarea));forEach no devuelve nada útil. Si guardas su resultado, obtienes undefined.
map: transformar
const numeros = [1, 2, 3];
const dobles = numeros.map(n => n * 2);
console.log(dobles); // [2, 4, 6]Un error común es usar map solo por sus efectos laterales. Si no vas a usar el array resultante, utiliza forEach o for...of.
filter: seleccionar
const edades = [12, 18, 25, 9];
const adultos = edades.filter(e => e >= 18);
console.log(adultos); // [18, 25]reduce: resumir
const compras = [3, 5, 2];
const total = compras.reduce((suma, c) => suma + c, 0);
console.log(total); // 10Si un bucle for...of queda más legible, úsalo. reduce no es obligatorio.
for y for...of: control total
Con los bucles clásicos puedes cortar la repetición con break o saltar una vuelta con continue. Los métodos forEach, map y filter no se pueden interrumpir con break.
const nombres = ['Ana', 'Luz', 'Leo'];
for (const nombre of nombres) {
if (nombre === 'Luz') break;
console.log(nombre);
}
// AnaEl for con índice resulta útil cuando necesitas la posición o recorrer en un orden distinto:
for (let i = nombres.length - 1; i >= 0; i--) {
console.log(nombres[i]);
}Combinar métodos
Se pueden encadenar porque map y filter devuelven arrays:
const productos = [
{ nombre: 'Té', stock: 3, precio: 4 },
{ nombre: 'Café', stock: 0, precio: 5 },
{ nombre: 'Cacao', stock: 2, precio: 6 }
];
const disponibles = productos
.filter(p => p.stock > 0)
.map(p => p.nombre);
console.log(disponibles); // ['Té', 'Cacao']¿Y for...in?
for...in recorre las claves de un objeto (y también las de un array, pero como texto). Para arrays es mejor for...of, que recorre los valores.
Regla rápida
- ¿Necesito un array nuevo? Usa
mapofilter. - ¿Solo ejecuto una acción? Usa
for...ofoforEach. - ¿Necesito parar antes? Usa
for...ofconbreak, ofind/some.
Última actualización: . Los ejemplos se han comprobado en un navegador actual y en Node.js.