请考虑以下内容
在这种情况下,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)
我真的不明白
答案 0 :(得分:0)
在lodash/fp中,所有功能都有一个fixed arity。 Arity是函数可以接受的参数数量。固定Arity表示该数字不是动态的。
具有固定arity的函数可以进行咖喱化-即,只要使用小于该函数arity的多个参数调用该函数,就不会调用该函数,而是返回其arity等于原始Arity-参数数量。只要参数数量等于原始Arity,就会调用该函数并返回结果。
find
是Arity为2的函数,当您调用find({ id: args.roleRateId })
时,将返回Arity为1的新函数。当使用单个参数(数组)调用该函数时,find将返回实际结果(找到的项目)。
get
是Arity为2的函数,当您调用get('chargeRate')
时,将返回Arity为1的新函数。当使用单个参数调用该函数时,get将返回实际结果(属性的值)。
flow
函数,接收一个或多个函数(流程的固定性不是固定的),然后返回一个新函数(我们将其称为fn
)。 fn
收到的任何内容都会传递给使用它创建的第一个函数(在您的情况下为find
)。该函数的结果将传递给第二个函数(在您的情况下为get
),依此类推(如果有两个以上)。最后一个函数(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
创建一个从args中提取属性的函数,而无需手动传递它们:
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>