1

我有以下对象:

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

我想将该cards属性的一些项目移动到hand.

我虽然使用镜头来防止物体发生变异,但无法得出一个解决方案,让我只需要组合函数就可以做到这一点。也许不应该那样做。

我能做的最好的如下:

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)
}
4

1 回答 1

2

这是一个版本:

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上看到它的运行情况。

于 2016-03-22T13:23:33.667 回答