В 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
:
Вы также можете создать функцию, используя 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>