Как передать аргумент каждой функции внутри функции составления в JavaScript - PullRequest
1 голос
/ 30 апреля 2019

У меня есть две функции, которые я хочу написать.

Первая функция требует двух параметров.Первый параметр - это дата, а второй - форматер даты.Примерно так:

/*
  Definition of date formats below:
  LTS  : 'h:mm:ss A',
  LT   : 'h:mm A',
  L    : 'MM/DD/YYYY',
  LL   : 'MMMM D, YYYY',
  LLL  : 'MMMM D, YYYY h:mm A',
  LLLL : 'dddd, MMMM D, YYYY h:mm A'
  Pass these into the second parameter of the formatDate function to return the expected date format
 */
export const formatDate = (date = moment(), F = "L") => moment(date).format(F); // F means format refer to the comment above before the function L is the default argument

Вторая функция также требует двух параметров.Первый параметр - это дата, а второй - количество месяцев, добавляемых в дату.Примерно так:

export const addMonth = (date = moment(), amount) => moment(date).add(amount, 'months');.

Теперь, когда я тестирую эти две функции вместе, используя jest .

 expect(
    Util.formatDate(
      Util.addMonth(
        new Date('December 17, 1995 03:24:00'), 1,
      ),
    ),
  ).toEqual("01/17/1996");

Теперь тестcase прошел, поэтому все, кажется, работает нормально.

Теперь я хочу использовать функцию compose , которая создает вызовы функции, принимает аргумент и передает основной аргумент для возврата окончательного результата.

Я нашел эту ссылку , которая мне в этом помогает.

и придумал следующий код:

const compose = (...functions) => args => functions.reduceRight((arg, fn) => fn(arg), args);

// Actual test case below:
 expect(
    compose(
      Util.formatDate,
      Util.addMonth,
    )(new Date('February 28, 2018 03:24:00')),
  ).toEqual("03/28/2018");

Как мне пройти каждый обязательные аргументы в этих вызовах функций внутри функции compose.Пример примерно так:

 expect(
    compose(
      (Util.formatDate, "L"),
      (Util.addMonth, 1),
    )(new Date('February 28, 2018 03:24:00')),
  ).toEqual("03/28/2018");

Если есть лучшая реализация для этого, вы можете сказать мне.Нужно ли использовать какую-то библиотеку для достижения этой цели?

Благодарим вас за помощь. Заранее спасибо.

1 Ответ

2 голосов
/ 30 апреля 2019

Чтобы это работало, вам нужно каррировать свои функции и менять порядок аргументов, потому что карри обычно требует обратного порядка:

// reusable combinators

const flip = f => y => x => f(x) (y);
const curry = f => x => y => f(x, y);
const comp = (f, g) => x => f(g(x));

// your functions

const formatDate = (x, y) => `formatDate(${x}, ${y})`;
const addMonth = (x, y) => `addMonth(${x}, ${y})`;

// your functions transformed to be compliant with function composition

const formatDate_ = flip(curry(formatDate));
const addMonth_ = flip(curry(addMonth));

// shows the computational structure

console.log(
  comp(
    formatDate_("F"),
    addMonth_("amount"))
      ("date")); // formatDate(addMonth(date, amount), F)

Теперь вы можете увидеть, что приносит вам карри: простое составление функций и частичное применение бесплатно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...