Map, filter, reduce — вот самые распространенные функции высшего порядка над списком. Высшего порядка они потому, что помимо списка принимают в качестве аргумента функцию. Рассмотрим, как они работают.
Map
Применяет некую функцию к каждому элементу списка.
Аргументы:
- функция от одного аргумента,
- список.
Результат: новый список с таким же количеством элементов, что и первоначальный.
Пример: возвести в квадрат каждое число из списка
map(square, [1, 2, 3]) // [1, 4, 9]
Filter
Отсеивает из списка элементы, которые не удовлетворяют некоторому условию. Условие выражено предикатом, который передается как аргумент в filter. Предикат — это функция, которая возвращает true или false в зависимости от переданных ей аргументов.
Аргументы:
- функция-предикат от одного аргумента,
- список.
Результат: новый список, содержащий некоторое количество элементов из первоначального списка.
Пример: выбросить из списка все нечетные числа
filter(isEven, [1, 2, 3]) // [2]
Reduce
Последовательно комбинирует вместе все элементы списка и некоторое исходное значение. Как именно комбинирует, задается переданной в reduce функцией. Исходное значение нужно потому что reduce пустого списка тоже должен что-то возвращать. Известен под альтернативным названием fold.
Аргументы:
- функция от двух аргументов,
- исходное значение,
- список.
Результат: все что угодно. Результатом может быть какое-нибудь единичное значение типа числа или строки, может быть список с любым количеством каких угодно элементов. Никаких ограничений. Кстати, если передать в reduce определенные функции и исходные значения, то можно добиться такого же поведения как от map или filter.
Пример: сложить вместе все числа в списке
reduce(add, 0, [1, 2, 3]) // 6