Woman with laptop and coffee

¿Cómo se usa reduce en Javascript?

Woman with laptop and coffee

El nombre de la función reduce() me confundía, debido a su nombre, me hacía pensar que restaba elementos de un arreglo (también llamado matriz o, en inglés, array). ¿Te sucede lo mismo? Ahora que entiendo cómo funciona, me he dado cuenta que es una función muy útil.

En este post te explicaré cómo usar la función reduce de los arrays en Javascript y maneras prácticas de utilizarlo.

¿Cómo funciona reduce en Javascript?

El método reduce efectúa una acción acumulativa en un arreglo. Esto lo logra al ejecutar una función sobre cada elemento del arreglo, y te devuelve como resultado un solo valor.

La función reduce puede recibir 2 argumentos:

  • función callback: esta función callback, a su vez, puede recibir 4 argumentos
    • valor anterior, también llamado acumulador
    • valor actual
    • indice actual
    • arreglo (array)
  • valor inicial

Sintaxis de reduce

Como lo que quiero lograr ahora es que entiendas la función reduce, a continuación te presento una sintaxis simplificada, que muestra solo los argumentos más comunes.

array.reduce(callback(valorAnterior, valorActual), valorInicial)

función callback: función a ejecutar en cada elemento del array. El valor que retorna, se convierte en valorAnterior en la siguiente invocación del callback.

  • valorAnterior: el valor que retornó el callback en la invocación anterior. La primera vez que se invoca el callback, equivale a valorInicial.
  • valorActual: el valor del elemento actual

valorInicial: es el valor a usar como valorAnterior en la primera llamada a la función callback.

Ejemplo sencillo para aprender a usar reduce

Una de las maneras más fáciles de entender cómo funciona reduce es usarlo para sumar una lista de números.

const array = [2, 8, 4, 1];

const suma = array.reduce((valorAnterior, valorActual) => {
  return valorAnterior + valorActual;
}, 0);

console.log(suma); // ➡️ 15

La función callback se ejecuta 4 veces:

  1. valorAnterior: 0, valorActual: 2, retorna 2
  2. valorAnterior: 2, valorActual: 8, retorna 10
  3. valorAnterior: 10, valorActual: 4, retorna 14
  4. valorAnterior: 14, valorActual: 1, retorna 15

¿Puedes visualizar la secuencia de cálculos en cada llamada del callback?

0 + 2 = 2
2 + 8 = 10
10 + 4 = 14
14 + 1 = 15

Aparte de usar reduce para calcular la suma de un arreglo de números, hay numerosas maneras prácticas de utilizarlo.

¿Cómo usar reduce con un array de objetos?

¿Cómo utilizar reduce para calcular el total de una factura?
¿Cómo utilizar reduce para calcular el total de una factura?

Puedes usar reduce para, por ejemplo, calcular el total de una factura.

const factura = {
  cliente: 'Empresa ABC',
  fechaDeExpedicion: '2023-09-08',
  productos: [
    { nombre: 'Bolsa de cafe', cantidad: 2, precio: 250, },
    { nombre: 'Teclado mecánico', cantidad: 1, precio: 100, },
    { nombre: 'Taza de vidrio', cantidad: 1, precio: 100, },
  ],
};

Nota que también hay que calcular el total teniendo en cuenta la cantidad de artículos.

const total = factura.productos.reduce((anterior, actual) => {
  return anterior + (actual.cantidad * actual.precio)
}, 0);

// total es 700

Puedes acceder al código en acción en StackBlitz: calcular el total de una factura.

¿Cómo deshacerse de valores duplicados en un array con reduce?

Supongamos que tienes este arreglo

const array = [
  'A', 'B', 'C', 'A', 
  'B', 'B', 'D', 'C',
];

¿Cómo podrías deshacerte de los valores que aparecen más de una vez y solo quedarte con los valores únicos? Además de usar reduce, estaremos utilizando otro método de Array, este es includes. Básicamente, éste último método determina si un array incluye cierto valor o no, y retorna true o false.

const unicos = array.reduce((unico, letra) => {
  if (unico.includes(letra)) {
    return unico;
  }
  
  return [...unico, letra];
}, []);

He aquí una versión concisa.

const unicos = array.reduce((unico, letra) =>
  (unico.includes(letra) ? unico : [...unico, letra]),
[]);

Usa reduce para contar el numero de veces que aparece un valor en un array

Para contar las ocurrencias de valores en un array usando reduce() podemos hacer algo como lo siguiente:

const frutas = [
  'Banana', 
  'Manzana', 
  'Naranja', 
  'Manzana', 
  'Fresa', 
  'Banana'
];

const ocurrencias = frutas.reduce((acumulador, frutaActual) => {
    return {
      ...acumulador, [frutaActual]: (acumulador[frutaActual] || 0) + 1,
    };
}, {});

// El resultado es el siguiente objeto:
// { "Banana": 2, "Manzana": 2, "Naranja": 1, "Fresa": 1 }

Nota que estamos utilizando el spread syntax o sintaxis extendida y el operador OR ||. Puedes ver este mismo ejemplo en StackBlitz: contar el número de veces que aparece un valor en un array.

Usa reduce para encontrar el valor máximo o mínimo en un array

Con reduce fácilmente puedes obtener los valores máximo y mínimo de un array con tan solo unas pocas líneas de código.

Para ilustrar, digamos que tienes un array de equipos con su respectivo puntaje.

const equipos = [
  { nombre: 'Tigres', puntos: 74 },
  { nombre: 'Los Bots', puntos: 55 },
  { nombre: 'Rockets', puntos: 80 },
  { nombre: 'Grupo Wifi', puntos: 91 },
  { nombre: 'Cafeteros', puntos: 63 },
];

¿Cómo encontrarías el valor máximo de puntos?

const max = equipos.reduce((acumulador, equipo) => {
    if (acumulador === null || equipo.puntos > acumulador) {
      return equipo.puntos;
    }

    return acumulador;
}, null);

La variable max tendría el valor 91.

En cada iteración revisamos si el número de puntos es mayor que el valor previo, o si el valor previo es null. Si así es, actualizamos el acumulador con el puntaje mayor.

En otras palabras, simplemente retornamos el puntaje mayor en cada iteración.

Ahora, ¿cómo encontrarías el valor mínimo de puntos? Solo hay que hacer un pequeño cambio, intenta identificarlo.

const min = equipos.reduce((acumulador, equipo) => {
  if (acumulador === null || equipo.puntos < acumulador) {
    return equipo.puntos;
  }

  return acumulador;
}, null);

La variable min tendría el valor 55.

La única diferencia entre encontrar el valor mínimo o máximo radica en el operador: de mayor que (>) a menor que (<).

Puedes encontrar el ejemplo completo en StackBlitz: Encontrar valor máximo y mínimo en un arreglo usando reduce.

Similar Posts