Ramda:提取uniq值的平面数组

时间:2018-07-24 16:38:36

标签: javascript functional-programming ramda.js

我确实有如下工作代码,但是我想知道Ramda是否有一种方法可以将整个表达式转换为一个可以定义输入数据参数的咖喱函数。也许甚至整个构成都不同。

const data = [
  { val: ['A', 'B'] },
  { val: ['C', 'D'] },
  { val: ['A', 'C', 'E'] },
]

R.uniq(R.flatten(R.map(R.prop('val'), data)))

我尝试使用R.__,但这可能工作方式有所不同,不适用于此类嵌套调用。

1 个答案:

答案 0 :(得分:1)

这是使用compose进行的函数的简单转换:

const {compose, uniq, flatten, map, prop} = R;

const data = [
  { val: ['A', 'B'] },
  { val: ['C', 'D'] },
  { val: ['A', 'C', 'E'] },
]

const extract = compose(uniq, flatten, map(prop('val')))

console.log(extract(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

这也可以用composepipe的Ramda颠倒顺序的孪生子来写:

const {pipe, uniq, flatten, map, prop} = R;

const data = [
  { val: ['A', 'B'] },
  { val: ['C', 'D'] },
  { val: ['A', 'C', 'E'] },
]

const extract = pipe(
  map(prop('val')),
  flatten, 
  uniq
)

console.log(extract(data))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

我个人选择compose用作单线,pipe选择更长的线。

在这两个函数中表达的函数组合概念对于Ramda而言非常重要。 (免责声明:我是Ramda的作者。)