В чем дело?
Функциональное программирование находится на подъеме, и это очень интересная для меня тема. Это позволяет мне писать краткий декларативный код, который легко тестировать и обдумывать. Что такое функциональное программирование? Я передам этот ответ кому-нибудь, кто более разбирается в предмете, Эрику Эллиоту:
Функциональное программирование (часто сокращенно ФП) - это процесс создания программного обеспечения путем составления чистых функций, избегая общего состояния изменяемых данных и побочные эффекты. Функциональное программирование является декларативным, а не императивным, и состояние приложения передается через чистые функции. В отличие от объектно-ориентированного программирования, где состояние приложения обычно совместно используется и совмещается с методами в объектах.
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 здесь. Очень коротко, обещаю!