2016-07-27 7 views
3

ramdaいくつかのプロパティを一度に更新するにはどうすればよいですか?私が得られる最も近いものはR.evolve()です。 evolveは、変換関数を使用してプロパティを変更したいと考えています。私はそれを直接したいと思います。しかし、R.assoc()では、一度に1つのプロパティのみを変更でき、文字列を使用してプロパティを指定する必要があります。複数のプロパティを更新する

これは私がevolveで、今それを行う方法である:私はJSで

const STATE_INITIAL = { 
    isDisabled: true, 
    isLoading: false 
}; 

R.evolve({ 
    isDisabled: R.not, 
    isLoading:() => true // I don't want to set a value using a function 
    }, state) 

object-spreadオペレータだろうと私は、新しいオブジェクト受け取るだろう:

{ ...state, isDisabled: !state.isDisabled, isLoading: true} 

答えて

1

1つのオプションは、レンズを使用することです:

const isDisabled = R.lensProp('isDisabled'); 
const isLoading = R.lensProp('isLoading'); 

// toggle :: State -> State 
const toggle = R.pipe(
    R.over(isDisabled, R.not), 
    R.set(isLoading, true) 
); 

toggle({isDisabled: true, isLoading: false}); 
// => {isDisabled: false, isLoading: true} 

R.lensProp,R.over、およびR.set

+0

興味深いオプション、デビッドの省略形です。共有していただきありがとうございます。しかし、かなり冗長です。私は今答えを受け入れないようにしました。多分誰かが別の解決策をとるだろう。新しいものが現れなければ私は答えを受け入れるでしょう。 – zatziky

1

Ramdaは物事をシンプルにしようとしています。だから、David Chambersの示唆しているようにパイプを通す以外は、あるプロパティと別のプロパティに関数を使うことはできません。また、このように記述することができ、彼の、バージョン、:

const toggle = R.pipe(
    R.over(R.lensProp('isDisabled'), R.not), 
    R.set(R.lensProp('isLoading'), true) 
) 

は確かにやや冗長な

const toggle = state => { 
    ...state, 
    isDisabled: !state.isDisabled, 
    isLoading: true  
} 

よりもですが、それはそんなに悪くは見えません。両方の性質のための機能を使用することにご異議が強すぎない場合には、かなり簡単ですevolveを使用して、元のバージョンのバリエーションがあります:

const toggle = R.evolve({ 
    isDisabled: R.not, 
    isLoading: R.T 
}) 

R.Tは単にR.always(true)

+0

Scott、ご意見ありがとうございます。 'R.evolve'は' R.T'と 'R.F'の後ろにあるとかなり良いようです。 – zatziky