Во многих сообщениях обсуждается как использовать .forEach(), .map(), .filter(), .reduce() и .find() в массивах в JavaScript. Я подумал, что было бы полезно объяснить, когда использовать общие методы массива.

.map(), .filter(), .reduce() и .find() ведут себя очень похоже на .forEach(), поэтому пока давайте сосредоточимся на последнем.

Что для каждого? Способ работы с элементами в массиве.

Если вы не знакомы с методом массива .forEach(), всякий раз, когда вы переходите к итерации по массиву, вы, вероятно, сразу думаете о цикле for.

Метод .forEach() - это просто другой способ сделать это. Следующие два примера кода эффективно выполняют одно и то же:

for петля

var array = [1,2,3];
for (var i = 0; i < array.length; i++){
  console.log(i);
}

.forEach()

var array = [1,2,3];
array.forEach(function(i){
  console.log(i);
});

Однако есть некоторые тонкие различия, которые могут сильно повлиять на ваш код.

Почему для каждого? Легкость использования и удобочитаемость.

Для меня наиболее убедительным аргументом в пользу использования .forEach() в пользу цикла for является то, что это проще. Даже при том же количестве линий меньше настроек. При использовании обычного цикла for у вас есть три шага:

  1. Определите значение итератора: var i = 0;
  2. Определите конечную точку: i ‹array.length;
  3. Расскажите, как цикл должен повторяться: i ++;

С .forEach() вы просто передаете функцию, которая выполняется для каждого элемента в массиве.

Почему для каждого? Сфера.

Если того факта, что это проще, вам недостаточно ... есть также техническая причина использовать .forEach() в пользу for петель. Это связано с масштабированием кода.

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

Когда использовать forEach?

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

Когда использовать карту?

.map(), если вы хотите преобразовать элементы в массиве.

Когда использовать фильтр?

.filter(), если вы хотите выбрать подмножество нескольких элементов из массива.

Когда использовать поиск?

.find() Если вы хотите выбрать одиночный элемент из массива.

Когда использовать сокращение?

.reduce(), если вы хотите получить одно значение из нескольких элементов в массиве.

Причуды и критика

forEach возвращает undefined.

Если вы преобразуете весь массив, вы, вероятно, захотите использовать вместо него .map(). .map() на самом деле возвращает массив, который полезен, потому что вы можете связать другие методы массива.

Пример:

const arr = [1,2,3];
const transformedArr = arr.map(function(){}).filter(function(){});

Несколько слов о скорости.

Одна из самых больших критических замечаний к .forEach() - скорость работы.

На самом деле вам не следует использовать .forEach(), если другие методы, такие как .map(), не помогут. .map() на самом деле немного быстрее, чем .forEach().

По общему признанию, .forEach() и .map() все еще медленнее, чем ванильный for цикл. Но судить о методе, основанном исключительно на скорости выполнения, сложно. Этот аргумент полностью игнорирует удобочитаемость и масштаб.

Главный вывод здесь - не используйте for циклы, потому что вы думаете, что они быстрее, используйте их, когда знаете, что вам нужно.

Научиться

Благодарим Эндрю Хеджеса за обнаружение ошибок и предложения!

Последующие статьи