В чем разница между .map, .every и .forEach?


118

Мне всегда было интересно, в чем разница между ними. Кажется, все они делают одно и то же ...


6
Кто-то добавил тег jQuery ... учитывая everyи forEachне методы jQuery, я думаю, что вряд ли вопрос каким-либо образом относится к jQuery. developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6
Джеймс Аллардис,

Я думаю, что по этой ссылке должен быть ответ, который вы ищете.
zBomb

Правильно ли я думаю, что вы имеете в виду новые методы массива, специфичные для Mozilla, как подробно описано в ссылке в моем предыдущем комментарии?
Джеймс Аллардис,

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

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

Ответы:


224

Разница в возвращаемых значениях.

.map() возвращает новый массив объектов, созданный путем выполнения некоторых действий с исходным элементом.

.every() возвращает логическое значение - истина, если каждый элемент в этом массиве удовлетворяет предоставленной функции тестирования. Важное отличие .every()состоит в том, что функция тестирования не всегда может быть вызвана для каждого элемента в массиве. Как только функция тестирования возвращает false для любого элемента, повторение элементов массива больше не выполняется. Следовательно, функция тестирования обычно не должна иметь побочных эффектов .

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

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


В качестве альтернативы можно было бы процитировать MDN
JoshWillik

3
@josh - я процитировал MDN. Имя каждого метода связано с соответствующей документацией в MDN.
gilly3

@ gilly3, приношу свои извинения, синий текст я не
заметила

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

1
@EugeneMercer Под «исходным элементом» я подразумеваю исходное значение каждого элемента массива.
gilly3

88

Ответ gilly3 отличный. Я просто хотел добавить немного информации о других типах функций "цикла по элементам".

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

кредит: TJCrowder Для каждого по массиву в JavaScript?


Получи от меня 100 лайков!
Шамим

6

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

Например:

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

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

с .forEach () вы не можете выполнить .sort (), вы получите сообщение об ошибке.


0

Для Ramda разница между R.map()и R.forEach()заключается в следующем:

  1. R.forEach()возвращает исходный массив, тогда как R.map()возвращает функтор
  2. R.forEach()может работать только с массивом, но R.map()может также работать с объектом (т.е. пары ключ / значение объекта обрабатываются как массив)

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