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

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


person 0x499602D2    schedule 07.09.2011    source источник
comment
Кто-то добавил тег jQuery ... учитывая, что every и forEach не являются методами jQuery, я думаю, вряд ли вопрос каким-либо образом относится к jQuery. developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6   -  person James Allardice    schedule 08.09.2011
comment
Я думаю, эта ссылка должен получить ответ, который вы ищете.   -  person zBomb    schedule 08.09.2011
comment
Правильно ли я думаю, что вы имеете в виду новые методы массива, специфичные для Mozilla, как подробно описано в ссылке в моем предыдущем комментарии?   -  person James Allardice    schedule 08.09.2011
comment
@James - Они не относятся к Mozilla. Я бы также поделился ссылкой на документы webkit и Opera, но я не знаю, где они находятся в моей голове.   -  person gilly3    schedule 08.09.2011
comment
@ gilly3 - Ах, хорошее замечание. Я считаю, что они поддерживаются только в IE9, но не ниже.   -  person James Allardice    schedule 08.09.2011
comment
@ Джеймс - Да, правда, к сожалению. Я обычно включаю сценарий, который добавляет эти методы для старых браузеров с использованием реализаций в MDN, перечисленных в разделе «Совместимость»: _ 1_, .every() , .forEach()   -  person gilly3    schedule 08.09.2011
comment
@JamesAllardice: Они соответствуют стандарту ECMA-262; еще не все браузеры поддерживают все в этом стандарте.   -  person Jon Adams    schedule 08.09.2011


Ответы (4)


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

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

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

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

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

person gilly3    schedule 07.09.2011
comment
В качестве альтернативы, MDN можно процитировать - person JoshWillik; 26.05.2014
comment
@josh - я процитировал MDN. Имя каждого метода связано с соответствующей документацией в MDN. - person gilly3; 26.05.2014
comment
@ gilly3, приношу свои извинения, синий текст не заметен ›.› - person JoshWillik; 27.05.2014
comment
.forEach () возвращает все, что не так, может быть, в 2012 году этого не было, но, по крайней мере, в 2015 году в Chrome, попробуйте это arr2 = ['sue', 'joe', 'ben', 'guy', 'tom', 'jon ']; b = arr2.forEach (функция (el, indx) {console.log (indx + ':' + el);}); console.log (б); - person jason; 17.06.2015
comment
@jason - Это undefined для меня журнал. Кроме того, ES5 Spec и ES6 Spec явно заявляет, что Array.prototype.forEach() должен возвращать undefined. - person gilly3; 17.06.2015
comment
просто для пояснения можно добавить prototype.some(). Но в остальном хорошее объяснение. - person Eduard Jacko; 09.07.2015
comment
@kresli - Не бойтесь документация. Я не пытаюсь документировать все методы итерации массива (не забывайте о .filter(), .reduce() и .reduceRight()). Мой ответ служит для пояснения трех методов, которые, похоже, делают одно и то же. .some() не имеет таких же проблем с двусмысленностью, поскольку он не ведет себя одинаково, и его имя не звучит так, как будто оно могло бы делать то же самое. - person gilly3; 09.07.2015
comment
@ gilly3 Вы говорите, что может показаться, что эти три метода делают одно и то же, а some - нет. Однако, поскольку some является полной противоположностью every, я хотел бы утверждать, что эти два значения можно перепутать, и он так же тесно связан с every, как и любые другие два. IMO @kresli делает хорошее замечание, добавляя примечание о some в ответ сделало бы его более полезным (на самом деле я пришел сюда, потому что меня смущала разница между some и every). - person ArneHugo; 03.02.2016
comment
.map выполняет итерацию по каждому элементу и выполняет функцию, которая не принимает исходный элемент. - person Tyrese; 21.05.2018
comment
@EugeneMercer Под исходным элементом я подразумеваю исходное значение каждого элемента массива. - person gilly3; 21.05.2018

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

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

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

person raphaelgontijolopes    schedule 31.07.2014
comment
Получи от меня 100 лайков! - person Shamim; 21.04.2020

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

Например:

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

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

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

person Nadine Rose    schedule 23.06.2016

Для Ramda разница между _ 1_ и R.forEach():

  1. R.forEach() возвращает исходный массив, тогда как R.map() возвращает функтор
  2. R.forEach() может работать только с массивом, но R.map() также может работать с объектом (т.е. пары ключ / значение объекта обрабатываются как массив)
person Michael Osofsky    schedule 09.05.2019
comment
Вопрос связан с языком Javascript. Ramda пока отличная - это совсем другая тема и библиотека. - person SeaWarrior404; 18.06.2019