Рубрики
Без рубрики

Мои любимые способы написать трубу и составить в JavaScript

Составьте, а особенно трубы, легко среди моих любимых функций. Эта статья просто будет весело и изучить различные реализации этих двух драгоценных камней. Я рекомендую вам понять, что они делают, прежде чем прочитать это; Возможно, проверьте мое глубокое погружение здесь. Труба = (… FNS) => (x) => fns.reduce ((v, f)

Автор оригинала: 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

Заключение

Фу! Это много способов трубы и составить!

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

Не имеет значения, если вы используете Уменьшить , Редустера Переключите заказ вызова или что-то еще.

Если вы хотите труба () , иди слева направо. Хотите составить ()? Идти вправо налево.

Легко и просто. До скорого!