2016-10-04 4 views
1

私はRamdaを使用して単純なtodoアプリケーションをコーディングすることに決めましたが、私は1つのリファクタリング関連の問題に取り組んできました。私が思うHere're二つの機能をリファクタリングすることができますRamda.jsリファクタリング

const isItemCompleted = R.pipe(
    R.prop("states"), 
    R.contains("completed") 
) 

const isItemEdited = R.pipe(
    R.prop("states"), 
    R.contains("editing") 
); 

あなたが見ることができるように、そこにいくつかのコードの重複があると私はより多くの状態を持っていた場合、これはさえメシエになるだろう。私はそのような重複機能を分離しようとしています:

const statesContains = R.flip(R.pipe(
    R.prop('states'), 
    R.contains() 
)) 

//I would like to use it like this: 
const isItemCompleted = statesContains("completed") 
const isItemEdited = statesContains("editing") 

しかし、私はこれを回避することはできません。私はそれを異なる引数の順序で動作させることができますが、私は簡潔な関数を作成するデータの最後のルールに従いたいと思います。

let item = {states:["editing", "complete"]}; 
isItemCompleted(item); //true 

どれ(機能)のアイデア:これらisItemCompletedとisItemEdited関数に渡される

データは次のようなものだろうか?

答えて

3

これにはいくつかの方法があります。

おそらく最も簡単には

const statesContains = R.curry(
    (state, item) => R.contains(state, R.prop('states', item)) 
); 

const isItemCompleted = statesContains("completed"); 

である。しかし、それは、プロパティが同様に変化するために検索できるようにするために、この抽象ビットにしたいために合理的です。だからあなたは書くことができる:

const propContains = R.curry(
    (propName, state, item) => R.contains(state, R.prop(propName, item)) 
); 

const editorsContains = propContains('editors') 
const edFred = editorsContains('fred'); 

// or edFred = propContains('editors', 'fred'); 

どちらも妥当である。しかし、Ramdaは本当にうまく読める機能を持っており、これらのニーズに十分に対応します。whereこれを使用すると、簡単に書くことができます:あなたは1オフを探しているなら

const isItemCompleted = R.where({states: R.contains('completed')}); 

これは、私は信じて、最も簡単な方法です。しかし、上記の両方は、再利用可能な関数を作成するのに役立ちます。

あなたはRamda REPL

にアクションでこのすべてを見ることができます
関連する問題