¿Cómo funciona el método reduce() en JavaScript?
Respuesta corta: reduce() recorre un array y lo convierte en un solo valor: un número, un objeto, un string u otro array. Recibe una función con dos parámetros, el acumulador y el elemento actual, y un valor inicial. Lo que devuelve la función en cada vuelta pasa a ser el acumulador de la siguiente:
const total = [1, 2, 3, 4].reduce((acumulador, n) => acumulador + n, 0);
console.log(total); // 10Pasa siempre el valor inicial, como el 0 del ejemplo. Sin él, reduce() falla con un array vacío y da resultados raros con arrays de objetos.
En cada vuelta, reduce() pasa el resultado anterior como acumulador. Con el valor inicial correcto, el mismo método suma, cuenta o agrupa.
Sintaxis de reduce()
array.reduce((acumulador, elementoActual, indice, array) => {
return nuevoAcumulador;
}, valorInicial);| Parámetro | Qué es | ¿Obligatorio? |
|---|---|---|
acumulador | El resultado que se va construyendo | Sí |
elementoActual | El elemento del array en esta vuelta | Sí |
indice | La posición del elemento | No |
array | El array completo | No |
valorInicial | El valor del acumulador en la primera vuelta | No, pero úsalo siempre |
reduce() no modifica el array original y devuelve el valor final del acumulador.
Cómo avanza reduce() vuelta a vuelta
Así suma [5, 10, 15].reduce((acc, n) => acc + n, 0):
| Vuelta | acc | n | Devuelve |
|---|---|---|---|
| 1 | 0 (valor inicial) | 5 | 5 |
| 2 | 5 | 10 | 15 |
| 3 | 15 | 15 | 30 |
El resultado es 30, lo que devolvió la última vuelta.
Ejemplos de reduce() en JavaScript
Sumar el total de un carrito
const carrito = [
{ producto: "Teclado", precio: 45, cantidad: 1 },
{ producto: "Ratón", precio: 20, cantidad: 2 },
{ producto: "Monitor", precio: 180, cantidad: 1 },
];
const total = carrito.reduce((suma, item) => suma + item.precio * item.cantidad, 0);
console.log(total); // 265Calcular el promedio
const notas = [7, 9, 6, 10];
const promedio = notas.reduce((suma, n) => suma + n, 0) / notas.length;
console.log(promedio); // 8Encontrar el valor máximo
const max = [12, 45, 7, 30].reduce((mayor, n) => (n > mayor ? n : mayor), -Infinity);
console.log(max); // 45Para números sueltos, Math.max(...array) es más corto y da el mismo resultado.
Contar cuántas veces aparece cada elemento
const votos = ["sí", "no", "sí", "sí", "abstención", "no"];
const conteo = votos.reduce((resultado, voto) => {
resultado[voto] = (resultado[voto] || 0) + 1;
return resultado;
}, {});
console.log(conteo); // { sí: 3, no: 2, abstención: 1 }Agrupar objetos por una propiedad
const alumnos = [
{ nombre: "Ana", curso: "IA" },
{ nombre: "Luis", curso: "Web" },
{ nombre: "Marta", curso: "IA" },
];
const porCurso = alumnos.reduce((grupos, alumno) => {
(grupos[alumno.curso] ??= []).push(alumno.nombre);
return grupos;
}, {});
console.log(porCurso); // { IA: ["Ana", "Marta"], Web: ["Luis"] }Si solo necesitas agrupar, Object.groupBy(alumnos, (a) => a.curso) lo hace en una línea y funciona en los navegadores actuales y en Node.js 21 o superior.
Aplanar un array de arrays
const plano = [[1, 2], [3], [4, 5]].reduce((todo, sub) => todo.concat(sub), []);
console.log(plano); // [1, 2, 3, 4, 5]Hoy [[1, 2], [3], [4, 5]].flat() hace lo mismo y se lee mejor.
