Javascript 如何在Ramda中的对象属性之间移动值?

Javascript 如何在Ramda中的对象属性之间移动值?,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,我的目标如下: var player = { cards: [1,2,3,4,5], hand: [] } 我想将卡属性的一些项目移动到手上 我曾想过使用镜头来防止对象发生变异,但无法找到一个解决方案,让我只需编写函数就可以做到这一点。也许不应该这样做 我能做的最好的事情如下: function drawIntoHand(amount, player) { const deck = R.lensProp('cards') const hand = R.lensProp('han

我的目标如下:

var player = {
  cards: [1,2,3,4,5],
  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)
}
以下是一个版本:

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]}
但我甚至不想让这样的东西免费。我不确定我怎么能做到,但如果我能做到,我很肯定这会更难阅读


你可以在

上看到它的作用。你想按索引还是按值移动卡片?通过组合函数(正如lambda演算告诉我们的那样),一切都是可能的,但它不一定是声明性的。为什么你要忽略
R.set(hand,R.append(cardsRemoved),player)