【问题标题】:Lodash fp (functional programming) reduce not working how I expect it to workLodash fp(函数式编程)减少了我期望的工作方式
【发布时间】:2017-10-29 15:53:27
【问题描述】:

使用没有 fp 的普通 lodash,你会做类似的事情

chain(array).map(..).reduce(...).value()

使用 fp,你会这样做

compose(reduce(...), map(...))(array)

我可以使它适用于许多方法(展平、排序、映射),但 reduce 除外。

你会期望它 (lodash/fp/reduce) 像这样工作

reduce((a,b)=>a+b, 0)([1,2,3])

但是 fp 版本仍然需要 3 个参数,这对我来说没有意义。所有其他功能对我来说都是这样工作的,除了 reduce

func(...)(array)

我怎样才能使 fpreduce 以这种方式像其他 fp 函数一样工作:

compose(reduce(...), map(...), flatten(...))(array)

【问题讨论】:

  • 问题是什么?
  • @hackerrdave 问题是,如何让它像所有其他 fp 函数一样工作?以可组合的方式。由于所有其他 fp 函数都可以正常工作,除了 reduce,我试图在这里找出我做错了什么。

标签: javascript functional-programming lodash


【解决方案1】:

无论是否使用函数式接口,reduce 总共需要 3 个参数。 lodash/fp 只是更改参数顺序并允许您部分功能

const fp = require ('lodash/fp')

const sum = fp.reduce (fp.add, 0)

const sq = x => x * x

const main = fp.compose (sum, fp.map (sq))

console.log (main ([1,2,3,4]))
// => 30
// [1,2,3,4] => [1,4,9,16] => 0 + 1 + 4 + 9 + 16 => 30

或作为内联组合

fp.compose (fp.reduce (fp.add, 0), fp.map (x => x * x)) ([1,2,3,4])
// => 30

【讨论】:

  • 谢谢。这行得通。我现在意识到我做错了什么。我没有提供起始值(不确定它叫什么)。我习惯在 Array.reduce() 中不使用它,所以出于习惯没有把它放在那里。我也在转换chain.map.reduce.value,它也没有使用它。傻我。
  • 考虑使用fp.flowfp.compose,倒序可能感觉更自然。 fp.composefp.flowRight 的别名。
  • 如何使用作为第三个参数传入的数据数组中的第一项填充第二个参数?例如,如果实现一个 Max 函数......(其中 -1 是可能的最大值等)。希望用一组数字映射 Max,所以不能只手动传入第二个值。
  • 我和var max = _.reduce((cur, acc) => greater(cur, acc), Number.NEGATIVE_INFINITY);一起去了
猜你喜欢
  • 1970-01-01
  • 2018-12-03
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2018-10-28
  • 1970-01-01
  • 2021-03-11
相关资源
最近更新 更多