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

Я всегда задавался вопросом, какая разница между ними. Они все, похоже, делают то же самое...

Ответ 1

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

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

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

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

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

Ответ 2

gilly3 ответ велик. Я просто хотел добавить немного информации о других типах функций "loop through elements".

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

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

Ответ 3

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

Например:

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

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

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

Ответ 4

Для Рамды разница между R.map() и R.forEach():

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