El reduce()
método reduce una matriz de valores a un solo valor. El valor único que se devuelve puede ser de cualquier tipo.
reduce()
es como la navaja suiza de métodos de matriz. Mientras que a otros les gusta map()
y filter()
brindan una funcionalidad específica, reduce()
se pueden usar para transformar una matriz de entrada en cualquier salida que desee, mientras se conserva la matriz original.
Sintaxis
const newValue = arr.reduce(function(accumulator, currentValue, index, array) { // Do stuff with accumulator and currentValue (index, array, and initialValue are optional) }, initialValue);
newValue
- el nuevo número, matriz, cadena u objeto que se devuelvearr
- la matriz en la que se operaaccumulator
- el valor devuelto de la iteración anteriorcurrentValue
- el elemento actual en la matrizindex
- el índice del artículo actualarray
- la matriz original en la quereduce()
se llamóinitialValue
- un número, matriz, cadena u objeto que sirve como valor inicial para la salida eventual
Ejemplos
ES5
var numbers = [1, 2, 3]; var sum = numbers.reduce(function(total, current) { return total + current; }, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6
ES6
const numbers = [1, 2, 3]; const sum = numbers.reduce((total, current) => { return total + current; }, 0); const sumOneLiner = numbers.reduce((total, current) => total + current, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6 console.log(sumOneLiner); // 6
Todo sobre initialValue
initialValue
Previsto
El initialValue
argumento es opcional. Si se proporciona, se utilizará como valor acumulador inicial ( total
) en la primera llamada a la función de devolución de llamada:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }, 1); console.log(product); // 24
Dado que el initialValue
de 1 se proporciona después de la función de devolución de llamada, reduce()
comienza al principio de la matriz y establece el primer elemento (2) como el valor actual ( current
). Luego itera por el resto de la matriz, actualizando el valor del acumulador y el valor actual en el camino.
initialValue
Omitido
Si initialValue
no se proporciona, la iteración comenzará en el segundo elemento de la matriz (en el índice 1), con accumulator
igual al primer elemento de la matriz e currentValue
igual al segundo elemento:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }); console.log(product);
En este ejemplo, no initialValue
se proporciona, por lo que reduce()
establece el primer elemento de la matriz como el valor del acumulador ( total
es igual a 2) y establece el segundo elemento de la matriz como el valor actual ( currentValue
es igual a 3). Luego itera por el resto de la matriz.
Al reducir una matriz de cadenas:
const strings = ['one', 'two', 'three']; const numberString = strings.reduce((acc, curr) => { return acc + ', ' + curr; }); console.log(numberString); // "one, two, three"
Si bien es fácil omitir el initialValue
argumento si su reduce()
método devolverá un número o una cadena simple, debe incluir uno si devolverá una matriz u objeto.
Devolver un objeto
Transformar una matriz de cadenas en un solo objeto que muestra cuántas veces aparece cada cadena en la matriz es simple. Simplemente pase un objeto vacío ( {}
) como initialValue
:
const pets = ["dog", "chicken", "cat", "dog", "chicken", "chicken", "rabbit"]; const petCounts = pets.reduce(function(obj, pet) { if (!obj[pet]) { // if the pet doesn't yet exist as a property of the accumulator object, // add it as a property and set its count to 1 obj[pet] = 1; } else { // pet exists, so increment its count obj[pet]++; } return obj; // return the modified object to be used as accumulator in the next iteration }, {}); // initialize the accumulator as an empty object console.log(petCounts); /* { dog: 2, chicken: 3, cat: 1, rabbit: 1 } */
Regreso y matriz
Generalmente, si planea devolver una matriz, map()
suele ser una mejor opción. Le dice al compilador (y a otros que lean su código) que cada elemento de la matriz original será transformado y devuelto como una nueva matriz de igual longitud.
Por otro lado, reduce()
indica que todos los elementos de la matriz original se transformarán en un nuevo valor. Ese nuevo valor podría ser una matriz, cuya longitud podría ser diferente a la original.
Supongamos que tiene una lista de la compra como una serie de cadenas, pero desea eliminar todos los alimentos que no le gustan de la lista. Puede usar filter()
para filtrar todo lo que no le gusta y map()
devolver una nueva matriz de cadenas, o simplemente puede usar reduce()
:
const shoppingList = ['apples', 'mangoes', 'onions', 'cereal', 'carrots', 'eggplants']; const foodsIDontLike = ['onions', 'eggplants']; const newShoppingList = shoppingList.reduce((arr, curr) => { if (!foodsIDontLike.includes(curr)) { arr.push(curr); } return arr; }, []); console.log(newShoppingList); // ["apples", "mangoes", "cereal", "carrots"]
Eso es todo lo que necesita saber sobre el reduce()
método. Como una navaja suiza, no siempre es la mejor herramienta para el trabajo. Pero te alegrará tenerlo en tu bolsillo trasero cuando realmente lo necesites.