Ramda管道有多个参数

时间:2016-12-16 23:23:03

标签: javascript ramda.js

我有一个需要多个参数的方法,我正在尝试设置一个ramda管道来处理它。

以下是一个例子:

const R = require('ramda');
const input = [
  { data: { number: 'v01', attached: [ 't01' ] } },
  { data: { number: 'v02', attached: [ 't02' ] } },
  { data: { number: 'v03', attached: [ 't03' ] } },
]

const method = R.curry((number, array) => {
  return R.pipe(
    R.pluck('data'),
    R.find(x => x.number === number),
    R.prop('attached'),
    R.head
  )(array)
})

method('v02', input)

是否有更简洁的方法,尤其是x => x.number === number的{​​{1}}部分,并且必须在管道的末尾调用filter

Here's指向上面加载到ramda repl。

中的代码的链接

2 个答案:

答案 0 :(得分:2)

这种方式可能会被重写:

const method = R.curry((number, array) => R.pipe(
  R.find(R.pathEq(['data', 'number'], number)),
  R.path(['data', 'attached', 0])
)(array))

我们已将[{1}}的匿名函数替换为R.pluck的匿名函数,并将R.find替换为R.pathEq作为谓词。找到后,可以通过使用R.find向下遍历对象的属性来检索该值。

可以使用R.path以无点的方式重写此内容,但我觉得可读性在此过程中会丢失。

R.useWith

答案 1 :(得分:2)

我认为可以使用pluckprop代替path来提高可读性。像这样:

const method = R.useWith(
  R.pipe(R.find, R.prop('attached')),
  [R.propEq('number'), R.pluck('data')]
);

当然,为功能使用一个好名字会更好。与getAttachedValueByNumber一样。