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

Логическое использование (определение состояния коллекции)

Первая группа функций — это те, которые возвращают логическое значение, представляющее состояние коллекции. Эти операции включают: каждый, включает и некоторые.

каждый — возвращает true, если все элементы в коллекции соответствуют критерию, и false, если какой-либо элемент является ложным.

[1,0,0].every((item) => item === 0); // false
[0,0,0].every((item) => item === 0); // true

some — возвращает true, если какой-либо элемент в коллекции возвращает true в обратном вызове.

[1,0,0].some((item) => item === 0); // true
[1,1,1].some((item) => item === 0); // false

includes — очень похоже на some, но вместо обратного вызова требуется значение для поиска.

[1,0,0].includes(0); // true
[1,1,1].includes(0); // false

для каждого

For Each немного отличается от любой другой итерационной функции. Это единственная из вышеперечисленных функций, которая не возвращает значение. Он предназначен для выполнения действия или установки значения (в объекте, переданном в обратный вызов). Однако он не предназначен для суммирования, создания отдельной коллекции и т. д.

function badUseOfForEach(collection) {  
     const arr = [];
     collection.forEach((item) => {
         item.someValue = 2;
         arr.push(item);
     });
     return arr;
}

Я вижу приведенный выше код совсем немного. Большинство разработчиков не понимают, что они изменяют исходный объект в collection, что имеет непредвиденные последствия. Вместо этого в приведенном выше случае следует использовать map.

Вот правильное использование forEach:

const tabs = [{ selected: false }, { selected: false }];
function selectTabByIndex(index) {  
     tabs.forEach((tab, i) => tab.selected = index === i);
}

Значения из коллекции

Эта категория содержит функции, которые принимают данную коллекцию и возвращают новое значение на основе исходной коллекции.

filter — возвращает новую коллекцию только со значениями, которые возвращают истину для обратного вызова. Будьте осторожны, это возвращает ссылку на объект, поэтому, если вы измените его в отфильтрованном массиве, он изменит его и в оригинале.

[1,2,3,4].filter((num) => num % 2 === 0); // [2,4]

map — возвращает новый массив, содержащий любое значение, возвращаемое обратным вызовом.

[1,2,3,4].map((num) => num * 2); //[2,4,6,8]

Карта — это правильная функция, которую следует использовать, если вы хотите сгенерировать что-то на основе каждого элемента массива. Эта функция и функция forEach чаще всего используются неправильно. Пожалуйста, не изменяйте исходную ссылку во время функции map. Если вы обнаружите, что делаете это, вам следует вместо этого использовать forEach.

reduce — используется для сокращения коллекции до одного значения. Например, если вы хотите создать сумму из значений в массиве:

[1,2,3,4].reduce((a,b) => a + b, 0); // 10

Я также всегда передаю значение «по умолчанию» в качестве второго аргумента функции. Причина этого такова: если массив пуст, будет выдана ошибка времени выполнения. Кроме того, он намекает на то, что ожидается в качестве ответа (какого типа).

reduceRight делает то же самое, но справа налево, а не слева направо.

find — возвращает первое значение, которое возвращает true для своего обратного вызова. Это полезно, когда известно, что в массиве есть уникальный элемент. Его не следует использовать для определения того, существует что-то или нет (в этом сценарии следует использовать some).

const people = [{  
  name: 'Evan'
}, {
  name: 'Even'
}];
const Evan = people.find((person) => person.name === 'Evan');

Вывод

Используя приведенные выше функции итерации, я смог почти полностью заменить использование for циклов. Однако знание правильного использования каждого из них может уберечь разработчиков от непредвиденных последствий! Надеюсь, это поможет с этим.