Яка різниця між .map, .every та .forEach?


118

Я завжди цікавився, в чому різниця між ними. Вони, здається, роблять те саме ...


6
Хтось додав тег jQuery ... враховуючи everyта forEachне є методами jQuery, я вважаю, що навряд чи питання стосується jQuery. developer.mozilla.org/uk/JavaScript/New_in_JavaScript/1.6
James Allardice

Я думаю, що це посилання має відповідати, який ви шукаєте.
zBomb

Я маю рацію, думаючи, що ви посилаєтесь на нові методи масиву Mozilla, як це детально описано у посиланні в попередньому коментарі?
Джеймс Еллардіс

@James - це не Mozilla . Я б також поділився посиланням на документи з веб-кік і опери, але я не знаю, де вони у верхній частині голови.
gilly3

@ gilly3 - Ах, хороший момент. Я вважаю, що вони підтримуються лише в IE9, хоча і не нижче.
Джеймс Еллардіс

Відповіді:


224

Різниця полягає у повернених значеннях.

.map() повертає новий масив об'єктів, створений за допомогою певних дій над оригінальним елементом.

.every() повертає булеву - true, якщо кожен елемент у цьому масиві задовольняє надану функцію тестування. Важлива відмінність у .every()тому, що тестова функція не завжди може бути викликана для кожного елемента масиву. Після того, як функція тестування поверне помилковий для будь-якого елемента, більше елементів масиву не повторюється. Тому функція тестування зазвичай не повинна мати побічних ефектів .

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

Про ці та багато інших методів ітерації масиву читайте на MDN .


Як альтернативу, можна вказати MDN
JoshWillik

3
@josh - я цитував MDN. Кожне ім'я методу пов'язане з відповідною документацією в MDN.
gilly3

@ gilly3, мої вибачення, я заскрив синій текст>.>
JoshWillik

.forEach () не повертає нічого поганого зараз, можливо, це не було в 2012 році, але в Chrome принаймні, спробуйте це arr2 = ['sue', 'joe', 'ben', 'guy', 'tom', 'jon ']; b = arr2.forEach (функція (el, indx) {console.log (indx + ':' + el);}); console.log (b);
Ясон

1
@EugeneMercer Під "оригінальним елементом" я маю на увазі вихідне значення кожного елемента масиву.
gilly3

88

відповідь gilly3 чудова. Я просто хотів додати трохи інформації про інші типи функцій "циклу через елементи".

  • .every() (перестає циклічно вперше, коли ітератор повертає помилку чи щось фальсифікує)
  • .some() (перестає циклічно вперше, коли ітератор повертає істину чи щось тривожне)
  • .filter() (створює новий масив, що включає елементи, де функція фільтра повертає істинні та опускаючи ті, де вона повертає помилкові)
  • .map() (створює новий масив із значень, повернутих функцією ітератора)
  • .reduce() (створює значення шляхом повторного виклику ітератора, передаючи попередні значення; деталі див. у специфікації; корисно для підсумовування вмісту масиву та багатьох інших речей)
  • .reduceRight() (як-от зменшення, але працює у порядку зменшення, а не у порядку зростання)

кредит: TJCrowder For-кожен для масиву в JavaScript?


Отримайте від мене 100 лайків!
Шамім

6

Ще один розгляд вищезазначених чудових відповідей - це ланцюжок. За допомогою ForEach () ви не можете зв'язати ланцюжок, але з картою () ви можете.

Наприклад:

var arrayNumbers = [3,1,2,4,5];

arrayNumbers.map(function(i) {
    return i * 2
}).sort();

з .forEach (), ви не можете зробити .sort (), ви отримаєте помилку.


0

Для Рамди різниця між R.map()і R.forEach()становить:

  1. R.forEach()повертає початковий масив, тоді як R.map()повертає функтор
  2. R.forEach()може працювати лише на масиві, але R.map()також може працювати на об'єкті (тобто пари ключів / значень об'єкта трактуються як масив)

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