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.
ткнути

Відповіді:


146

Вони не одне і те саме. Дозвольте мені пояснити різницю.

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

map: Це повторює список, перетворює кожного члена цього списку та повертає інший список такого ж розміру з перетвореними членами (наприклад: перетворення списку рядків у верхній регістр)

Список літератури

Array.prototype.forEach () - JavaScript | MDN

Array.prototype.map () - JavaScript | MDN


5
І як сказав Xufox - .forEach нічого не повертає, це так. Дякуємо за допомогу! Я відзначу цю відповідь через 10 хвилин.
DzikiChrzan

1
карта повернення списку і ForEach ні. ОК
Ашад Насім

62
  • Array.forEach "Виконує надану функцію один раз на елемент масиву."

  • Array.map "Створює новий масив з результатами виклику наданої функції для кожного елемента цього масиву."

Отже, forEachнасправді нічого не повертає. Він просто викликає функцію для кожного елемента масиву і потім це робиться. Так що все, що ви повернетеся в межах цієї закликаної функції, просто відкидається.

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

Це також означає, що ви можете використовувати mapде завгодно, forEachале ви все одно не повинні цього робити, щоб не збирати повернені значення без будь-якої мети. Це просто ефективніше не збирати їх, якщо вони вам не потрібні.


Зауважимо: у 2015 році можна було б сперечатися, що це forEachбуло б "ефективніше", ніж mapособливо, якщо для заповнення forEachстарого браузера (IE8 або 9) потрібна полізасипка . Вам не потрібно призначати повернення mapнічого; повернене значення має отримувати сміття, зібране відразу після mapповернення, коли повернення mapне призначено.
ковбер

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

Чи гарантовано як дляEach, так і для карти обробку елементів в одному порядку?
Квентін 2,

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

25
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| | передбачити | карта |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Функціональність | Виконує задану операцію на кожній | Виконує задане "перетворення" на |
| | елемент масиву | "копія" кожного елемента |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Повернене значення | Повертає невизначене | Повертає новий масив з перетвореною |
| | | елементи, що залишають назад початковий масив |
| | | без змін |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +
| Переважні | Виконання неперетворення на зразок | Отримання масиву, що містить вихід |
| сценарій використання | обробка на кожному елементі. | деяка обробка, виконана на кожному елементі |
| та приклад | | масиву. |
| | Наприклад, збереження всіх елементів у | |
| | база даних | Наприклад, отримання масиву |
| | | довжини кожного рядка в |
| | | масив |
+ ---------------- + -------------------------------- ----- + --------------------------------------- +

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

2
Це може допомогти вам намалювати таблиці мистецтв ASCII: webapps.stackexchange.com/q/6700/126269
Панг

16

Основна відмінність, яку вам потрібно знати, - це .map()повернення нового масиву, але .forEach()ні. Ось чому ви бачите цю різницю у виході. .forEach()просто оперує кожним значенням масиву.

Прочитайте:

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


7

forEach: Якщо ви хочете виконати дію на елементах масиву, він такий, як ви використовуєте для циклу. Результат цього методу не дає нам просто купити цикл через елементи.

map: Якщо ви хочете виконати дію на елементах масиву, а також ви хочете зберегти висновок вашої дії в масив. Це схоже на цикл у функції, яка повертає результат після кожної ітерації.

Сподіваюся, це допомагає.


5

Різниця полягає в тому, що вони повертаються. Після виконання:

arr.map()

повертає масив елементів, отриманий в результаті оброблюваної функції; поки:

arr.forEach()

повертається невизначеним.


5

Аналіз продуктивності Для циклів працює швидше, ніж карта чи передбачити, оскільки кількість елементів масиву збільшується.

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
Flavio Vilante

2

Різниця між Foreach та картою:

Map () : Якщо ви використовуєте map, map може повернути новий масив, повторивши основний масив.

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

useFul посилання : використовуйте це посилання для розуміння різниці

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


1

Одне, що слід зазначити, це те, що foreach пропускає неініціалізовані значення, тоді як карта цього не робить.

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 () та картою ()

forEach () просто проведіть елементи. Це викидає повернені значення і завжди повертається невизначеними. Результат цього методу не дає нам результату.

цикл 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 () :

повернене значення: невизначене

originalArray: змінено після виклику методу

map () :

повернення значення: новий масив, заповнений результатами виклику наданої функції на кожному елементі масиву виклику

originalArray: не змінено після виклику методу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.