Fuente
Ambos map
y reduce
tienen como entrada la matriz y una función que defina. Son de alguna manera complementarios: map
no pueden devolver un solo elemento para una matriz de elementos múltiples, mientras reduce
que siempre devolverán el acumulador que finalmente cambió.
map
Utilizando map
itera los elementos, y para cada elemento devuelve un elemento que desea.
Por ejemplo, si tiene una matriz de números y desea obtener sus cuadrados, puede hacer esto:
const square = x => x * x
console.log([1, 2, 3, 4, 5].map(square))
reduce
Al usar una matriz como entrada, puede obtener un solo elemento (digamos un Objeto, un Número u otra matriz) basado en la función de devolución de llamada (el primer argumento) que obtiene los parámetros accumulator
y current_element
:
const numbers = [1, 2, 3, 4, 5]
console.log(numbers.reduce(function (acc, current) {
return acc + current
}, 0))
console.log(numbers.reduce(function (acc, current) {
return acc * current
}, 1))
¿Cuál debería elegir cuando puede hacer lo mismo con ambos? Intente imaginar cómo se ve el código. Para el ejemplo proporcionado, puede calcular la matriz de cuadrados como mencionó, usando reduce
:
[1, 2, 3, 4, 5].reduce(function (acc, current) {
acc.push(current*current);
return acc;
}, [])
[1, 2, 3, 4, 5].map(x => x * x)
Ahora, mirando estos, obviamente la segunda implementación se ve mejor y es más corta. Por lo general, elegiría la solución más limpia, que en este caso es map
. Por supuesto, puede hacerlo con reduce
, pero en pocas palabras, piense cuál sería más corto y eventualmente sería mejor.
reduce
? No puedes, eso es lo que intenté mostrar en esos ejemplos.console.log([1, 2, 3, 4, 5].reduce(function (acc, current) { acc.push( current = current*current); return acc; }, []))
Generalmente, "mapear" significa convertir una serie de entradas en una serie de salidas de igual longitud , mientras que "reducir" significa convertir una serie de entradas en un número menor de salidas.
Lo que la gente quiere decir con "mapa-reducción" se suele interpretar como "transformar, posiblemente en paralelo, combinar en serie".
Cuando "mapa", que está escribiendo una función que transforma
x
conf(x)
en algún nuevo valorx1
. Cuando "reduce" está escribiendo alguna funcióng(y)
que toma matrizy
y emite matrizy1
. Trabajan con diferentes tipos de datos y producen diferentes resultados.fuente
Creo que esta imagen te responderá sobre la diferencia entre esos HOC
fuente
los
map()
función devuelve una nueva matriz pasando una función sobre cada elemento de la matriz de entrada.Esto es diferente a lo
reduce()
que toma una matriz y una función de la misma manera, pero la función toma2
entradas: un acumulador y un valor actual.Por
reduce()
lo tanto, podría usarse comomap()
si siempre estuviera.concat
en el acumulador la siguiente salida de una función. Sin embargo, se usa más comúnmente para reducir las dimensiones de una matriz, por lo que se toma una unidimensional y devuelve un valor único o se aplana una matriz bidimensional, etc.fuente
Echemos un vistazo a estos dos uno por uno.
Mapa
Map toma una devolución de llamada y la ejecuta contra cada elemento de la matriz, pero lo que la hace única es que genera una nueva matriz basada en su matriz existente .
var arr = [1, 2, 3]; var mapped = arr.map(function(elem) { return elem * 10; }) console.log(mapped); // it genrate new array
Reducir
El método Reducir del objeto de matriz se utiliza para reducir la matriz a un solo valor .
var arr = [1, 2, 3]; var sum = arr.reduce(function(sum, elem){ return sum + elem; }) console.log(sum) // reduce the array to one single value
fuente
Para comprender la diferencia entre mapa, filtro y reducción, recuerde esto:
Map
devuelve una nueva matriz con el mismo no. de elementos como hay en la matriz original. Por lo tanto, si la matriz original tiene 5 elementos, la matriz devuelta también tendrá 5 elementos. Este método se usa siempre que queremos hacer algún cambio en cada elemento individual de una matriz. Puede recordar que cada elemento de la matriz ann se asigna a algún valor nuevo en la matriz de salida, por lo tanto, el nombremap
Por ejemplo,var originalArr = [1,2,3,4] //[1,2,3,4] var squaredArr = originalArr.map(function(elem){ return Math.pow(elem,2); }); //[1,4,9,16]
Filter
devuelve una nueva matriz con un número igual o menor de elementos que la matriz original. Devuelve aquellos elementos en la matriz que han pasado alguna condición. Este método se usa cuando queremos aplicar un filtro en la matriz original, por lo tanto, el nombrefilter
. Por ejemplo,var originalArr = [1,2,3,4] //[1,2,3,4] var evenArr = originalArr.filter(function(elem){ return elem%2==0; }) //[2,4]
Reduce
devuelve un valor único, a diferencia de un mapa / filtro. Por lo tanto, siempre que queremos ejecutar una operación en todos los elementos de una matriz pero queremos una única salida con todos los elementos, usamosreduce
. Puede recordar que la salida de una matriz se reduce a un solo valor, por lo tanto, el nombrereduce
. Por ejemplo,var originalArr = [1,2,3,4] //[1,2,3,4] var sum = originalArr.reduce(function(total,elem){ return total+elem; },0) //10
fuente