В чем дело?

Функциональное программирование находится на подъеме, и это очень интересная для меня тема. Это позволяет мне писать краткий декларативный код, который легко тестировать и обдумывать. Что такое функциональное программирование? Я передам этот ответ кому-нибудь, кто более разбирается в предмете, Эрику Эллиоту:

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

ES6 предлагает множество функций, которые позволяют нам легко писать чистые функции, причем rest / spread является одним из самых мощных. Используя rest params, мы можем зацикливаться без циклов с рекурсией. В этой статье мы собираемся переписать многие часто используемые методы / функции JavaScript, которые позволяют использовать функциональные шаблоны.

Предисловие

Следующие функции предназначены для демонстрационных и обучающих целей. Многие функции ниже являются хвостовыми рекурсивными и нуждаются в дальнейшей оптимизации. Исправление хвостовой рекурсии не является предметом этой статьи. ES6 обеспечивает оптимизацию хвостового вызова, но должен использоваться вместе с 'use strict'.

Голова

Вернуть первый элемент в массиве. Полезно, когда вам нужно отделить первый элемент от остальных элементов массива. Для этого мы используем деструктурирующее задание.

Пример использования:

Хвост

Вернуть все, кроме первого элемента в массиве.

По сути, это то же самое, что писать:

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

Пример использования:

Def

Вернуть, если предоставленный аргумент определен.

Пример использования:

Undef

Вернуть, если предоставленный аргумент не определен.

Пример использования:

Копировать

Возвращает копию массива без использования Array.slice(). Использует спред.

Пример использования:

Длина

Вернуть длину массива. Это очень простая форма перебора массива с рекурсией, хотя значения массива в данном случае не имеют значения (увеличивается с 1 для каждого элемента в массиве). Мы включаем параметр len, чтобы избежать хвостовой рекурсии.

Если нас не волнует хвостовая рекурсия, мы можем записать ее как:

Это добавило бы кадр стека для каждого элемента в массиве, тогда как версия, которая избегает хвостовой рекурсии, заменяет один кадр стека. Если переданный массив достаточно велик, он выдаст сообщение «Превышен максимальный размер стека вызовов».

Пример использования:

Задний ход

Вернуть перевернутый массив.

Пример использования:

Array.reverse() в порядке, но он изменяет значение на месте, что является побочным эффектом. Учтите следующее:

Первый

Возвращает новый массив, содержащий первые n элементов данного массива.

Пример использования:

Последний

Возвращает новый массив, содержащий последние n элементов данного массива.

Пример использования:

Кусочек

Возвращает новый массив со значением, вставленным по данному индексу.

Пример использования:

isArray

Возвращает, если предоставленное значение является массивом. Позволяет писать Array.isArray() более функционально.

Пример использования:

Сплющивать

Объединяет вложенные массивы в один массив.

Пример использования:

Поменять местами

Вернуть новый массив с двумя элементами, замененными на основе их индекса.

Пример использования:

карта

Из MDN: «… создает новый массив с результатами вызова предоставленной функции для каждого элемента в этом массиве».

Что можно упростить как:

Пример использования:

Фильтр

Из MDN: «… создает новый массив со всеми элементами, которые проходят проверку, реализованную предоставленной функцией».

Что можно упростить как:

Пример использования:

Отклонять

В отличие от filter, возвращает массив, который не передает функцию фильтра.

Пример использования:

Раздел

Разбивает массив на два массива. Один, элементы которого проходят функцию фильтрации, и один, элементы которого не выполняются.

Пример использования:

Уменьшать

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

Что можно упростить как:

Пример использования:

ReduceRight

Аналогично сокращению, но применяет функцию справа налево.

Пример использования:

Частичное

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

Пример использования:

SpreadArg

Преобразуйте функцию, которая принимает массив в массив, который принимает несколько аргументов. Это полезно при частичном применении.

Пример использования:

Если вы хотите определить только одну функцию, вы можете записать ее как:

В приведенном выше описании вам нужно не забыть распространять массив, который вы отправляете в функцию, рекурсивно, поскольку вы распространяете аргумент.

ReverseArgs

Обратный порядок аргументов функции.

Пример использования:

Обращение аргументов может быть полезно при частичном применении аргументов. Иногда вам нужно частично применить аргументы в конце списка, а не в начале. Изменение аргументов позволяет нам это сделать.

Сорвать

Извлечь значение свойства из массива. Полезно в сочетании с функцией карта.

Пример использования:

Поток

Каждая функция потребляет возвращаемое значение предыдущей функции.

Пример использования:

Сочинять

То же, что и поток, но аргументы применяются в обратном порядке. Compose более естественно соответствует тому, как написаны функции. Используя те же данные, что и для функции flow:

Пример использования:

Мин.

Вернуть наименьшее число в массиве. Возвращает Бесконечность, если предоставленный массив пуст.

Пример использования:

Максимум

Вернуть наибольшее число в массиве. Возвращает -Infinity, если предоставленный массив пуст.

Пример использования:

Факториал

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

Пример использования:

Фибоначчи

Возвращает число Фибоначчи в заданном месте.

Пример использования:

Быстрая сортировка

Отсортируйте массив от наименьшего к наибольшему. Это делается путем переупорядочивания массива так, чтобы он содержал два подмассива, один с меньшими значениями, а другой с большими значениями. Вышеупомянутые шаги рекурсивно применяются к каждому подмассиву до тех пор, пока не останутся массивы, которые сглаживаются, чтобы вернуть отсортированный массив.

Это также можно реализовать с помощью раздела, но для этого требуется присвоение переменных.

Пример использования:

Все как сокращение

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

Пример использования:

Заключение

Я надеюсь, что эта статья поможет пролить свет на некоторые шаблоны, доступные с помощью JavaScript и ES6. Многие проблемы, которые можно решить с помощью итераций / циклов, также можно решить функционально с помощью рекурсии. Я надеюсь, что эта статья также смогла показать вам гибкость функции сокращения.

Обратная связь? Слова поддержки? 🎉

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