После нескольких недель программирования на Ruby я обнаружил, что несколько методов итерации в JavaScript являются функциями высшего порядка. Функции высшего порядка — это функции, которые принимают другую функцию в качестве аргумента или возвращают другую функцию. Мы рассмотрим все методы итерации в JavaScript и подробно рассмотрим функции итерации более высокого порядка.

.entries()

возвращает итератор массива, который содержит пару ключ/значение для каждого элемента в массиве

Здесь мы устанавливаем переменную «итератор» равной Bakery.entries(). Свойство .__proto__ переменной iterator показывает нам, что это итератор массива (примечание: это не то же самое, что массив!). У него также есть свойство «далее», которое является функцией. Если мы вызовем .next() для «итератора», мы получим объект с ключом, названным «значение» (о, какая ирония), со значением массива. Когда мы запускаем .next().value для «итератора», он показывает нам два элемента в массиве — первый элемент является номером индекса (ключом) в массиве пекарни, а второй элемент является значением. Однако, поскольку «итератор» — это итератор массива, нам показали массив ключ/значение для второго элемента в пекарне, потому что мы уже однажды вызывали .next(). Когда мы снова вызовем .next().value, он выведет пару ключ/значение для третьего (последнего элемента) в нашем массиве пекарни. Если мы попытаемся запустить это в последний раз, вы увидите, что мы получаем undefined в консоли, потому что мы уже прошли через этот массив. Возвращаемое значение всех операций, которые мы выполняли с итератором массива, были неопределенными.

Вот лучший способ сделать глупость, которую я описал выше:

.ключи()

возвращает итератор массива всех ключей массива

.ценности()?!?!?!

MDN ругается, что это итератор. Однако у меня это не работает, так как вам нужен Google Chrome версии 66. Он работает так же, как .keys()

Функции итераторов высшего порядка

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

.каждый()

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

.фильтр()

передается функции и возвращает массив только со значениями, прошедшими проверку в функции.

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

.найти()

возвращает первый элемент, который соответствует условию, указанному в функции, которая была передана для поиска

Для того же массива кексов, который использовался выше в фильтре, мы найдем первый объект с ценой больше 3:

.findIndex()

возвращает порядковый номер первого элемента, который соответствует условию, переданному в функцию обратного вызова

Индекс номер 4 в приведенном выше примере — это кекс красный бархат, который является первым элементом в массиве, цена которого равна 4.

.для каждого()

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

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

Наш массив студентов останется без изменений. Обратите внимание, что наше возвращаемое значение для цикла forEach не определено.

.карта()

Мы используем карту, когда хотим преобразовать каждый элемент в нашем массиве.

Возвращаемое значение представляет собой преобразованный массив. Если условие не выполняется для определенного элемента массива, возвращаемый массив будет иметь значение «undefined» по этому индексу. Другими словами, если у кекса №3 не было вкуса, в возвращаемом массиве для третьего элемента (индекс 2) будет undefined.

.уменьшать()

принимает два аргумента: функцию, которая будет применяться к каждому элементу массива, и необязательное значение, к которому функция должна быть агрегирована. Если передается второй параметр (значение), он становится initialVal, а currentValue — значением с индексом 0. Если второй параметр не передается, initialVal — это значение с индексом 0, а currentVal — значение с индексом 1. .

.reduceRight()

работает так же, как .reduce, за исключением справа налево.

.немного()

возвращает логическое значение, указывающее, было ли выполнено условие в функции обратного вызова любым из элементов массива.

Спасибо за чтение!! Надеюсь, вам понравилось!