GUÍA · Bucles y arrays

forEach, map, filter o for...of: cuál usar

Compara forEach, map, filter, reduce, for y for...of en JavaScript: qué devuelve cada uno, cuándo conviene y cómo elegir según lo que necesites hacer.

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...UsaDevuelve
Hacer algo con cada elemento (mostrar, guardar)forEach o for...ofundefined
Crear una lista transformada del mismo tamañomapArray nuevo
Quedarme con los que cumplen una condiciónfilterArray nuevo
Encontrar el primero que cumplefindUn elemento o undefined
Obtener un solo resultado (suma, objeto...)reduceCualquier valor
Parar antes de terminarfor, for...of, some, find—

forEach: ejecutar una acción

JavaScript
const tareas = ['Leer', 'Practicar'];
tareas.forEach(tarea => console.log('Pendiente:', tarea));

forEach no devuelve nada útil. Si guardas su resultado, obtienes undefined.

map: transformar

JavaScript
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

JavaScript
const edades = [12, 18, 25, 9];
const adultos = edades.filter(e => e >= 18);
console.log(adultos); // [18, 25]

reduce: resumir

JavaScript
const compras = [3, 5, 2];
const total = compras.reduce((suma, c) => suma + c, 0);
console.log(total); // 10

Si 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.

JavaScript
const nombres = ['Ana', 'Luz', 'Leo'];

for (const nombre of nombres) {
  if (nombre === 'Luz') break;
  console.log(nombre);
}
// Ana

El for con índice resulta útil cuando necesitas la posición o recorrer en un orden distinto:

JavaScript
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:

JavaScript
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

  1. ¿Necesito un array nuevo? Usa map o filter.
  2. ¿Solo ejecuto una acción? Usa for...of o forEach.
  3. ¿Necesito parar antes? Usa for...of con break, o find/some.

Última actualización: . Los ejemplos se han comprobado en un navegador actual y en Node.js.