JavaScript: diferencia entre .forEach () y .map ()


116

Sé que hubo muchos temas como este. Y conozco lo básico: .forEach()funciona en la matriz original y .map()en la nueva.

En mi caso:

function practice (i){
    return i+1;
};

var a = [ -1, 0, 1, 2, 3, 4, 5 ];
var b = [ 0 ];
var c = [ 0 ];
console.log(a);
b = a.forEach(practice);
console.log("=====");
console.log(a);
console.log(b);
c = a.map(practice);
console.log("=====");
console.log(a);
console.log(c);

Y esta es la salida:

[ -1, 0, 1, 2, 3, 4, 5 ]
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
undefined
=====
[ -1, 0, 1, 2, 3, 4, 5 ]
[ 0, 1, 2, 3, 4, 5, 6 ]

No puedo entender por qué el uso practicecambia el valor de ba undefined.
Lo siento si esta es una pregunta tonta, pero soy bastante nuevo en este idioma y las respuestas que encontré hasta ahora no me satisfacen.


49
Es así de simple: .map devuelve una nueva matriz , mientras .forEach que no devuelve nada . Básicamente, si desea obtener una forma modificada de la matriz anterior, use .map, si no lo desea, use .forEach.
user4642212


@Xufox: rojo este tema antes de crear uno nuevo, pero la respuesta no me satisfizo.
DzikiChrzan

No digas que no te satisfizo. ¿Cómo no responde exactamente a su pregunta (¿ha leído todas las respuestas?)? ¿Cuál es su pregunta específica que no está cubierta por el objetivo duplicado propuesto?
user4642212

@Xufox Esa pregunta trata sobre las funciones autoempleadas y no se trata realmente de las funciones estandarizadas de ES5.
empuje el

Respuestas:


146

No son lo mismo. Déjame explicarte la diferencia.

forEach: Esto itera sobre una lista y aplica alguna operación con efectos secundarios a cada miembro de la lista (ejemplo: guardar cada elemento de la lista en la base de datos)

map: Esto itera sobre una lista, transforma cada miembro de esa lista y devuelve otra lista del mismo tamaño con los miembros transformados (ejemplo: transformar la lista de cadenas a mayúsculas)

Referencias

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


4
Y como dijo Xufox, .forEach no devuelve nada, ese es el caso. ¡Gracias por la ayuda! Marcaré esta respuesta en 10 minutos.
DzikiChrzan

mapa de lista de retorno y forEach not. OK
Ashad Nasim

62
  • Array.forEach "Ejecuta una función proporcionada una vez por elemento de matriz".

  • Array.map "Crea una nueva matriz con los resultados de llamar a una función proporcionada en cada elemento de esta matriz".

Entonces, en forEachrealidad no devuelve nada. Simplemente llama a la función para cada elemento de la matriz y luego está listo. Entonces, todo lo que devuelva dentro de esa función llamada simplemente se descarta.

Por otra parte, map llamará de manera similar a la función para cada elemento de la matriz, pero en lugar de descartar su valor de retorno, lo capturará y creará una nueva matriz de esos valores de retorno.

Esto también significa que puede usar mapdonde sea que esté usando, forEachpero aún así no debe hacerlo para no recopilar los valores de retorno sin ningún propósito. Es más eficiente no recolectarlos si no los necesita.


Nota: en 2015, habría sido discutible que forEachhubiera "sido más eficiente" que, mapespecialmente, si se requiriera un polyfill para soportar forEachun navegador más antiguo (IE8 o 9). No es necesario asignar la devolución de mapa nada; el valor de retorno debe recolectarse la basura inmediatamente después de las mapdevoluciones cuando mapno se asigna la devolución de .
cowbert

3
@cowbert El hecho de que algo se recolecte como basura de inmediato, no significa que las asignaciones que eran necesarias no te afecten. Por forEachlo tanto , conceptualmente seguirá siendo más eficiente y más adecuado para tareas en las que no necesita recopilar resultados. Y no sé ustedes, pero en 2015, ya no estaba desarrollando para IE8 (que por cierto tampoco era compatible map); y soporte IE9 + forEach. Y de hecho, un mes después de mi respuesta, Microsoft dejó de ofrecer soporte para esos navegadores.
empuje el

¿Están garantizados tanto forEach como map para procesar los elementos en el mismo orden?
Quentin 2 de

1
@ Quentin2 Sí, también, ambas funciones son síncronos, de modo mapy forEachllamadas sólo regresarán una vez que todo el conjunto se ha enrollado a través de la devolución de llamada y ha sido llamado para cada uno.
empuje el

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | foreach | mapa |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Funcionalidad | Realiza una operación dada en cada | Realiza una "transformación" dada en |
| | elemento de la matriz | "copia" de cada elemento |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Valor devuelto | Devoluciones indefinidas | Devuelve una nueva matriz con transformado |
| | | elementos que dejan atrás la matriz original |
| | | sin cambios |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Preferible | Realización de no transformación como | Obtención de matriz que contiene la salida de |
| escenario de uso | procesamiento en cada elemento. | algún procesamiento realizado en cada elemento |
| y ejemplo | | de la matriz. |
| | Por ejemplo, guardar todos los elementos en | |
| | la base de datos | Por ejemplo, obtener una matriz de |
| | | longitudes de cada cadena en el |
| | | matriz |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

Por favor, editar tu post y mostrar el texto real en lugar de imágenes. Otros no pueden copiar y pegar desde su imagen, o buscar dentro de su imagen, o ayudar a mejorar el contenido del texto en la imagen. Consulte aquí para obtener más detalles. Gracias.
Pang

2
Esto puede ayudarlo a dibujar tablas de arte ASCII: webapps.stackexchange.com/q/6700/126269
Pang


7

forEach: si desea realizar una acción sobre los elementos de una matriz y es la misma que usa para el bucle. El resultado de este método no nos da una salida de compra, solo recorre los elementos.

map: si desea realizar una acción en los elementos de una matriz y también desea almacenar la salida de su acción en una matriz. Esto es similar al bucle for dentro de una función que devuelve el resultado después de cada iteración.

Espero que esto ayude.


5

La diferencia radica en lo que devuelven. Después de la ejecución:

arr.map()

devuelve una matriz de elementos resultantes de la función procesada; mientras:

arr.forEach()

devuelve indefinido.


5

Análisis de rendimiento Los bucles For funcionan más rápido que map o foreach a medida que aumenta el número de elementos en una matriz.

let array = [];
for (var i = 0; i < 20000000; i++) {
  array.push(i)
}

console.time('map');
array.map(num => {
  return num * 4;
});
console.timeEnd('map');


console.time('forEach');
array.forEach((num, index) => {
  return array[index] = num * 4;
});
console.timeEnd('forEach');

console.time('for');
for (i = 0; i < array.length; i++) {
  array[i] = array[i] * 2;

}
console.timeEnd('for');

Aquí está el resultado en mi computadora:map: 1642ms forEach: 885ms for: 748ms
Flavio Vilante


1

Una cosa a señalar es que foreach omite valores no inicializados mientras que map no lo hace.

var arr = [1, , 3];

arr.forEach(function(element) {
    console.log(element);
});
//Expected output: 1 3

console.log(arr.map(element => element));
//Expected output: [1, undefined, 3];

0

Diferencia entre forEach () y map ()

forEach () simplemente recorre los elementos. Elimina los valores devueltos y siempre devuelve indefinidos. El resultado de este método no nos da una salida.

map () recorre los elementos asigna memoria y almacena valores de retorno iterando la matriz principal

Ejemplo:

   var numbers = [2,3,5,7];

   var forEachNum = numbers.forEach(function(number){
      return number
   })
   console.log(forEachNum)
   //output undefined

   var mapNum = numbers.map(function(number){
      return number
   })
   console.log(mapNum)
   //output [2,3,5,7]

map () es más rápido que forEach ()



0

forEach () :

valor de retorno: indefinido

originalArray: modificado después de la llamada al método

mapa () :

valor de retorno: nueva matriz poblada con los resultados de llamar a una función proporcionada en cada elemento de la matriz de llamada

originalArray: no modificado después de la llamada al método

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.