JavaScript: разница между .forEach () и .map ()


116

Я знаю, что таких тем было много. И я знаю основы: .forEach()работает как с исходным массивом, так и .map()с новым.

В моем случае:

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);

И это вывод:

[ -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 ]

Я не могу понять, почему использование practiceменяет значение bна undefined.
Прошу прощения, если это глупый вопрос, но я новичок в этом языке, и ответы, которые я нашел до сих пор, меня не удовлетворили.


49
Это просто: .map возвращает новый массив , но .forEach ничего не возвращает . В принципе, если вы хотите получить измененную форму предыдущего массива, вы используете .map, если вы этого не хотите, вы используете .forEach.
user4642212


@Xufox - Я красил эту тему перед созданием новой, но ответ меня не удовлетворил.
DzikiChrzan

Не говорите, что это вас не удовлетворило. Как именно он не отвечает на ваш вопрос (все ответы вы прочитали?)? Какой ваш конкретный вопрос не охвачен предлагаемой повторяющейся целью?
user4642212

@Xufox Этот вопрос касается самореализуемых функций, а не о стандартизованных функциях ES5.
тыкает

Ответы:


148

Они не одно и то же. Позвольте мне объяснить разницу.

forEach: Это выполняет итерацию по списку и применяет некоторую операцию с побочными эффектами к каждому члену списка (пример: сохранение каждого элемента списка в базе данных)

map: Это выполняет итерацию по списку, преобразует каждый член этого списка и возвращает другой список того же размера с преобразованными элементами (пример: преобразование списка строк в верхний регистр)

Ссылки

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


5
И, как сказал Xufox - .forEach ничего не возвращает, это так. Спасибо за помощь! Я отмечу этот ответ через 10 минут.
DzikiChrzan

1
список возврата карты, а для каждого - нет. OK
Ashad Nasim 02

62
  • Array.forEach «Выполняет предоставленную функцию один раз для каждого элемента массива».

  • Array.map «Создает новый массив с результатами вызова предоставленной функции для каждого элемента в этом массиве».

Итак, на forEachсамом деле ничего не возвращает. Он просто вызывает функцию для каждого элемента массива и готово. Поэтому все, что вы возвращаете в этой вызываемой функции, просто отбрасывается.

С другой стороны, mapаналогичным образом вызовет функцию для каждого элемента массива, но вместо того, чтобы отбросить возвращаемое значение, он захватит его и построит новый массив этих возвращаемых значений.

Это также означает, что вы можете использовать mapвезде, где вы используете, forEachно вам все равно не следует этого делать, поэтому вы не собираете возвращаемые значения без какой-либо цели. Просто эффективнее не собирать их, если они вам не нужны.


Примечательно: в 2015 году можно было бы утверждать, что это forEachбыло бы «более эффективно», чем mapособенно, если бы полифил требовался для поддержки forEachв более старом браузере (IE8 или 9). Возврат mapничего не нужно назначать ; возвращаемое значение должно быть собрано мусором сразу после mapвозврата, если возврат mapне назначен.
Cowbert

3
@cowbert Тот факт, что что-то сразу же собирается сборщиком мусора, не означает, что вы не пострадали от выделения памяти, которое было необходимо. Таким образом forEach, концептуально он по- прежнему будет более эффективным и лучше подходит для задач, в которых вам не нужно собирать результаты. И я не знаю, как вы, но в 2015 году я больше не занимался разработкой для IE8 (который, кстати, тоже не поддерживал map); и поддержка IE9 + forEach. И фактически через месяц после моего ответа Microsoft прекратила поддержку этих браузеров.
тыкает

Гарантируется ли, что forEach и map будут обрабатывать элементы в одном порядке?
Quentin 2

1
@ Quentin2 Да, кроме того , обе функции являются синхронными, так mapи forEachвызовы будут возвращать только после того , как весь массив был петельные через и обратный вызов был вызван для каждого.
тык

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | foreach | карта |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Функциональность | Выполняет данную операцию на каждом | Выполняет данное «преобразование» на |
| | элемент массива | «копия» каждого элемента |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Возвращаемое значение | Возвращает undefined | Возвращает новый массив с преобразованным |
| | | элементы, оставляющие исходный массив |
| | | без изменений |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Предпочтительно | Выполнение нетрансформации вроде | Получение массива, содержащего вывод |
| сценарий использования | обработка каждого элемента. | обработка каждого элемента |
| и пример | | массива. |
| | Например, сохранение всех элементов в | |
| | база данных | Например, получение массива |
| | | длины каждой строки в |
| | | массив |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

Пожалуйста, отредактируйте свое сообщение и покажите фактический текст вместо изображений. Другие не могут копировать и вставлять с вашего изображения, или выполнять поиск по вашему изображению, или помогать улучшить текстовое содержание изображения. Подробности смотрите здесь . Спасибо.
Pang

3
Это может помочь вам нарисовать таблицы ASCII art: webapps.stackexchange.com/q/6700/126269
Pang

16

Основное отличие, которое вам нужно знать, - это .map()возвращает новый массив, а .forEach()не возвращает . Вот почему вы видите такую ​​разницу в выводе. .forEach()просто работает с каждым значением в массиве.

Прочитать:

Вы также можете проверить: - Array.prototype.every()- JavaScript | MDN


7

forEach: если вы хотите выполнить действие над элементами массива, и оно будет таким же, как при использовании цикла for. Результат этого метода не дает нам выхода покупки, просто перебирает элементы.

map: если вы хотите выполнить действие с элементами массива, а также хотите сохранить результат своего действия в массиве. Это похоже на цикл for внутри функции, которая возвращает результат после каждой итерации.

Надеюсь это поможет.


5

Разница в том, что они возвращают. После казни:

arr.map()

возвращает массив элементов, полученных в результате обработанной функции; пока:

arr.forEach()

возвращает undefined.


5

Анализ производительности Циклы For работают быстрее, чем map или foreach, по мере увеличения количества элементов в массиве.

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');

Вот результат на моем компьютере:map: 1642ms forEach: 885ms for: 748ms
Флавио Виланте

2

Разница между Foreach и картой:

Map () : если вы используете карту, карта может вернуть новый массив, повторяя основной массив.

Foreach () : если вы используете Foreach, он не может ничего возвращать для каждой итерации основного массива.

useFul ссылка : используйте эту ссылку для понимания различий

https://codeburst.io/javascript-map-vs-foreach-f38111822c0f


1

Следует отметить, что foreach пропускает неинициализированные значения, а map - нет.

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

Разница между forEach () и map ()

forEach () просто перебирает элементы. Он отбрасывает возвращаемые значения и всегда возвращает undefined. Результат этого метода не дает нам вывода.

Цикл map () по элементам выделяет память и сохраняет возвращаемые значения, повторяя основной массив

Пример:

   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 () быстрее, чем forEach ()



0

forEach () :

возвращаемое значение: undefined

originalArray: изменен после вызова метода

карта () :

возвращаемое значение: новый массив, заполненный результатами вызова предоставленной функции для каждого элемента в вызывающем массиве

originalArray: не изменяется после вызова метода

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.