Поток Лодаша && получить && найти вместе - PullRequest
0 голосов
/ 19 марта 2019

Учтите, что следующие значения args.roleRateId будут равны 11604 в этом случае, а args.roleRates будут равны массиву объектов, которые имеют кратные значения, рассмотрим для этого упражнения следующее let arr = [ { id:1 , chargeRate: 200} , { id:2 ,chargeRate: 250} ] это будут значениянаших args.roleRates.Учитывая приведенные выше значения, может кто-нибудь объяснить шаг за шагом, что происходит внутри

flow(find({ id: args.roleRateId }), get('chargeRate'))(args.roleRates)

Я действительно не понимаю

1 Ответ

0 голосов
/ 19 марта 2019

В lodash / fp все функции имеют фиксированную арность . Arity - это число аргументов, которые может принять функция. Фиксированная арность означает, что число не является динамическим.

Функции с фиксированной арностью могут быть каррированы - т. Е. Всякий раз, когда функция вызывается с числом аргументов, которое меньше арности функции, функция не вызывается, но возвращает новую функцию с арностью, равной оригинальная арность - количество аргументов . Всякий раз, когда число аргументов равно исходной арности, функция вызывается и возвращает результат.

  • find - это функция с арностью 2, когда вы вызываете find({ id: args.roleRateId }), возвращается новая функция с арностью 1. Когда эта функция вызывается с одним аргументом (массивом), find возвращает фактический результат (найденный элемент).

  • get - это функция с арностью 2, когда вы вызываете get('chargeRate'), возвращается новая функция с арностью 1. Когда эта функция вызывается с одним аргументом, get возвращает фактический результат (значение свойства).

Функция flow получает одну или несколько функций (арность потока не фиксирована) и возвращает новую функцию (назовем ее fn). Все, что получает fn, передается первой функции, с которой оно было создано (find в вашем случае). Результат этой функции передается во 2-ю функцию (get в вашем случае) и т. Д. (Если их больше 2). Возвращаемое значение последней функции (get) является результатом fn.

Поскольку в вашем случае вы получаете один объект args, вам необходимо вручную разделить его и назначить ему внешнюю функцию flow и внутреннюю функцию find:

const { flow, find, get } = _

const fn = args => flow(
  find({ id: args.roleRateId }),
  get('chargeRate')
)(args.roleRates)

const args = {
  roleRateId: 1,
  roleRates: [{ id:1 , chargeRate: 200 }, { id:2 ,chargeRate: 250 }]
}

const result = fn(args)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

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

const { flow, props, spread, useWith, find, identity, get } = _

const fn = flow(
  props(['roleRateId', 'roleRates']), // get an array of [roldRateId, roleRates]
  spread(useWith(find, [id => ({ id }), identity])), // create a function that takes the props array, convert the roleRateId value to { id: value } object, invokes find
  get('chargeRate') // get the chargeRate's value from the result of find
)

const args = {
  roleRateId: 1,
  roleRates: [{ id:1 , chargeRate: 200 }, { id:2 ,chargeRate: 250 }]
}

const result = fn(args)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...