Reducir un array

El objeto array tiene varios métodos para recorrerlo e ir procesando cada uno de sus elementos para buscar un valor o para construir otro array, por ejemplo.

Los métodos reduce() y reduceRight() también son iteradores, pero lo que hacen es convertir el array en un único valor. Este valor va a venir dado por una función de llamada pasada como argumento.

La función de llamada, función de reducción, lleva en esta ocasión cuatro argumentos: uno al que podemos llamar acumulador seguido del habitual trío de argumentos opcionales: valor del elemento, indice del elemento y array.

Además de la función reductora el método acepta un segundo argumento opcional como valor inicial. Antes de la primera iteración el acumulador toma este valor. Es indicado usarlo si el array puede estar vacio.

La función se aplica cada vez que se lee un elemento del array. El valor que tome el acumulador en cada llamada se mantiene para la siguietne. De ahí el nombre. Funcionaría como una variable global.

La diferencia entre ambos métodos es que reduceRgiht recorre el array en sentido inverso, es decir desde el final al inicio.

Una aplicación muy sencilla que clarifica el uso de este método sería una función que suma todos los elementos del array y finalmente devuelve el valor conseguido.

var datos = [2,3,4,5,6,7,8];

var total;

total = datos.reduce(function(ac,v){ return ac += v})

console.log(total) //35

Con valor inicial y recorrido inverso

var datos = [2,3,4,5,6,7,8];

var total;

total = datos.reduceRight(function(ac,v){ return ac += v}, 10)

console.log(total) //45

Y ya puestos para que no todo sea numérico

var datos = ['a','e','i','o','u'];

var vocales;

vocales = datos.reduce(function(ac,v){ return ac += v})

console.log(vocales) ;

vocales = datos.reduceRight(function(ac,v){ return ac += v})

console.log(vocales) ;

 

Como ves el método reduceRight produce la cadena invertida, pues comienza el recorrdio del array desde su último elemento.

Este método puede usarse también como conversor de tipo de datos, podemos convertir el array en una cadena con condiciones.

var datos = ['a','o','u', 4 ,'b','v','d','e',1,2];

var reducir = function(ac,v){

isNaN(v)? ac += v:ac;

return ac;}

letras = datos.reduce(reducir);

console.log(letras)

En este ejemplo se salta los valores numéricos para crear una cadena solo con las letras. Se podría invertir la condición para que sume valores numéricos.