Автор оригинала: FreeCodeCamp Community Member.
составить
и особенно труба
, легко среди моих любимых функций.
Эта статья просто будет весело и изучить различные реализации этих двух драгоценных камней. Я рекомендую вам понять, что они делают, прежде чем прочитать это; Возможно, проверьте Мой глубокий погружение здесь Отказ
pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
Классика.
Начиная с самой левой функции, уменьшите массив функций в одно значение, вызвав следующую функцию с выходом предыдущего.
double = (x) => x * 2; add1 = (x) => x + 1; pipe( double, add1 )(100); // 201
Я обнаружил эту реализацию через Эрик Эллиотт и написал глубокое погружение на это здесь Отказ
Использовать Редустера
реализовать составить
Отказ Теперь ваши функции называются справа, налево.
compose = (...fns) => (x) => fns.reduceRight((v, f) => f(v), x); compose( double, add1 )(100); // 202
Вы могли бы также обратить вспять FNS
и продолжать использовать Уменьшить
(меньше исполнения).
compose = (...fns) => (x) => fns.reverse().reduce((v, f) => f(v), x); compose( double, add1 )(100); // 202
Обратный
Мутирует массив, хотя, поэтому вы можете скопировать его в первую очередь (даже менее исполнителя).
compose = (...fns) => (x) => [...fns].reverse().reduce((v, f) => f(v), x); compose( double, add1 )(100); // 202
Использовать Редустера
вернуться к труба
Отказ
pipe = (...fns) => (x) => [...fns].reverse().reduceRight((v, f) => f(v), x); pipe( double, add1 )(100); // 201
Но они все совпадают
Все вышеперечисленные фрагменты, кстати, являются Унарный Отказ Каждая функция может принимать только единый аргумент Отказ
Если первая функция вашего трубопровода должна быть Нары (Принятие n
Аргументы), попробуйте эту реализацию:
multiply = (x, y) => x * y; pipe = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); pipe( multiply, add1 )(10, 10); // 101 // Takes multiple args now
Этот фрагмент от 30secondsofcode.org Отказ Ваша первая (крайняя левая) функция может принять N
Аргументы – все остальные должны быть одинарными.
Опять же, Редустера
дает нам составить
Отказ Теперь ваша крайняя правая функция может принять N
Аргументы. Давайте переместим Умножьте
до конца цепочки.
compose = (...fns) => fns.reduceRight((f, g) => (...args) => g(f(...args))); compose( add1, multiply )(10, 10); // 101 // Takes multiple args now // Put multiply first
Как и раньше, вы могли бы поменять FNS
Массив и продолжайте использовать Уменьшить
:
compose = (...fns) => [...fns].reverse().reduce((f, g) => (...args) => g(f(...args))); compose( add1, multiply )(10, 10); // 101
Если вы хотите сохранить Уменьшить
Без небольшого удара производительности, просто переключайте G
и F
:
compose = (...fns) => fns.reduce((f, g) => (...args) => f(g(...args))); compose( add1, multiply )(10, 10); // 101
И использовать Редустера
вернуться в труба
Отказ
pipe = (...fns) => fns.reduceRight((f, g) => (...args) => f(g(...args))); pipe( multiply, add1 )(10, 10); // 101 // put multiply first now
Заключение
Фу! Это много способов трубы и составить!
Это просто доказывает, что, несмотря ни на что, вы Необходимо петить на массиве функций, вызывая следующий с результатом предыдущего бизнеса Отказ
Не имеет значения, если вы используете Уменьшить
, Редустера
Переключите заказ вызова или что-то еще.
Если вы хотите труба ()
, иди слева направо. Хотите составить ()? Идти вправо налево.
Легко и просто. До скорого!