Cómo funciona reduce en JavaScript

Resumen

El método reduce en JavaScript es la herramienta más poderosa para transformar arrays cuando map y filter se quedan cortos. Aprenderás a usarlo para totalizar, calcular promedios y construir pipelines de datos con programación funcional, ideal si ya manejas lo básico de arrays y quieres escribir código más declarativo.

¿Qué hace reduce y en qué se diferencia de map y filter?

Los tres métodos son las herramientas clásicas para manipular arrays en lenguajes como JavaScript, Python, Go o PHP. Cada uno cumple un rol distinto dentro del flujo de datos.

  • map transforma los datos: si entran cinco elementos, salen cinco elementos.
  • filter reduce el número de elementos según una condición; nunca devuelve más de los que recibió.
  • reduce rompe la regla porque el resultado puede ser un solo valor, un objeto, otro array o incluso algo más grande, según tu lógica de negocio.

El caso más clásico de reduce es totalizar un array de números en un único valor, como sumar todas las edades de una base de clientes [01:30].

¿Qué es reduce en JavaScript? Es un método de array que recorre cada elemento y los acumula en un único resultado, definido por la función que tú escribas. Puede devolver un número, un objeto o cualquier estructura.

¿Cómo funciona la sintaxis de reduce con accumulator y current value?

La firma de reduce tiene dos partes: una callback function y un estado inicial o init value [04:10]. Ese segundo parámetro es clave y siempre debería existir, porque define desde dónde arranca la acumulación.

El init value puede ser:

  • Un 0 si vas a totalizar números.
  • Un {} si vas a reducir todo a un objeto.
  • Un [] si la salida final es otro array.

Dentro de la callback, reduce recibe cuatro parámetros: el accumulator, el currentValue, el currentIndex y el array original. El acumulador guarda el valor que se va sumarizando en cada iteración. En la primera vuelta, el acumulador es exactamente el init value porque todavía no se ha procesado nada [05:50].

¿Por qué reduce siempre debe retornar un valor?

Porque ese return es el nuevo estado del acumulador para la siguiente iteración. Si no retornas nada, el acumulador queda en undefined y rompe el flujo. Si retornas el acumulador sin modificarlo, el resultado final será simplemente el valor inicial, como pasa al imprimir sum y obtener 0 cuando no hay lógica adentro.

¿Cómo sumar y calcular un promedio con reduce?

Con un array [1, 2, 3, 4, 5], el algoritmo es directo: en cada iteración, retornas accumulator + currentValue. El resultado es 15, la suma total.

js const numbers = [1, 2, 3, 4, 5]; const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);

Para calcular el promedio de edades de un array de clientes, lo elegante es encadenar métodos: primero un map para extraer solo las edades, luego un reduce para sumarlas y finalmente dividir entre la longitud del array.

js const averageAge = customers .map(customer => customer.age) .reduce((acc, age) => acc + age, 0) / customers.length;

Aquí pasas de un array de objetos a un array de números, y de ahí a un solo valor. Es el patrón típico de un pipeline de transformación de datos en programación funcional.

¿Cuándo usar reduce en lugar de un for clásico? Úsalo cuando ya tengas pipelines de transformación con map o filter, o cuando quieras código más declarativo y menos imperativo. Para totalizar, maximizar o agrupar, reduce es más expresivo.

¿Cómo construir pipelines de datos con map, filter y reduce?

La fuerza real aparece cuando concatenas métodos. Puedes hacer un map para normalizar, un filter para descartar lo que no cumple una condición y un reduce para totalizar el resultado. Cada paso recibe el array transformado del paso anterior.

Esto te permite leer el código casi como una receta: primero esto, luego esto, luego lo otro. Es la base de la programación funcional aplicada a arrays y se traduce bien a otros lenguajes.

¿Qué reto puedes practicar para dominar reduce?

Un ejercicio clásico: dado un array de números, encuentra la suma máxima de dos elementos consecutivos. Por ejemplo, en [1, 2, 3, 4, 5] el resultado es 9, porque la suma de 4 + 5 es la más alta entre todos los pares consecutivos.

La complicación llega con arrays desordenados o con números negativos, donde la pareja ganadora puede estar en cualquier posición. Resolverlo con un solo reduce te obliga a pensar el acumulador como una estructura, no solo como un número, y ahí es donde le pierdes el miedo de verdad.

¿Qué pipeline de datos resolverías más rápido si lo reescribieras con reduce? Cuéntame en los comentarios cómo lo aplicarías en tu proyecto actual.