我有一个需要多个参数的方法,我正在尝试设置一个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。
中的代码的链接答案 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)
我认为可以使用pluck
和prop
代替path
来提高可读性。像这样:
const method = R.useWith(
R.pipe(R.find, R.prop('attached')),
[R.propEq('number'), R.pluck('data')]
);
当然,为功能使用一个好名字会更好。与getAttachedValueByNumber
一样。