2016-03-21 1 views
1

私は、以下の目的を持っている:Ramdaのオブジェクトのプロパティ間でどのように値を移動できますか?

var player = { 
    cards: [1,2,3,4,5], 
    hand: [] 
} 

は私がhandcardsプロパティのいくつかのアイテムを移動したいです。

レンズを使ってオブジェクトの変異を防ぐことはできますが、機能を構成するだけの方法で解決できる解決策には到達できませんでした。そんなことはしないと思われるかもしれません。

私は何ができる最善のは、以下の通りである:

function drawIntoHand(amount, player) { 
    const deck = R.lensProp('cards') 
    const hand = R.lensProp('hand') 

    let cardsRemoved = R.over(deck, R.take(amount), player) 
    R.set(hand, R.append(cardsRemoved), player) 
    return R.set(deck, R.drop(amount), player) 
} 
+0

カードをインデックスまたは値で移動しますか? – Comptonburger

+1

関数を合成することですべてが可能です(lambda calculusが教えてくれます)が、必ずしも宣言的ではありません。 – Bergi

+1

なぜ 'R.set(手、R.append(cardsRemoved)、player)'の結果を無視していますか? – Bergi

答えて

1

ここに1つのバージョンである:

const drawIntoHand = (() => { 
    const deck = lensProp('cards'); 
    const hand = lensProp('hand'); 

    return (amount, player) => { 
    const draw = take(amount, view(deck, player)); 
    return over(deck, drop(amount), over(hand, concat(draw), player)); 
    }; 
})(); 

drawIntoHand(3, player); //=> {"cards": [4, 5], "hand": [1, 2, 3]} 

しかし、私はしても、これはポイントのないようなものを作るしようとしないでしょう。どうすればいいのか分かりませんが、できれば読むのがずっと難しくなります。

Ramda REPLでご覧になれます。

関連する問題