2016-12-16 24 views
0

複数の引数を必要とするメソッドがあり、それを処理するramdaパイプを設定しようとしています。ここで複数の引数を持つ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) 

は、この、filterの特にx => x.number === number一部をやって、パイプの終わりに(array)を呼び出すために持つのクリーナー方法はありますか?

Here's上記のコードへのリンクは、ramda replにロードされています。これはおそらく書き換えることができ

答えて

2

一つの方法:

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

ここでは、R.pluckの使用を交換してきましたし、匿名関数の代わりにR.findに述語として与えR.pathEqR.findに与えられました。一度検出されると、値はR.pathとオブジェクトのプロパティを歩くことによって取得できます。

R.useWithを使用して、ポイントフリーの方法でこれを書き直すことは可能ですが、読みやすさが失われてしまいます。

const method = R.useWith(
    R.pipe(R.find, R.path(['data', 'attached', 0])), 
    [R.pathEq(['data', 'number']), R.identity] 
) 
1

私は読みやすさではなくpathpluckpropを使用して向上させることができると思います。このように:

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

もちろん、機能には良い名前を使用することをお勧めします。 getAttachedValueByNumberのように。

関連する問題