Lodash流&&获得&&一起找到

时间:2019-03-19 15:55:53

标签: javascript lodash

请考虑以下内容 在这种情况下,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 :(得分: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>