【问题标题】:How can I move values between properties of an object in Ramda?如何在 Ramda 中的对象属性之间移动值?
【发布时间】:2016-03-22 21:23:33
【问题描述】:

我有以下对象:

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

【问题讨论】:

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

标签: javascript functional-programming ramda.js


【解决方案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 上看到它的实际效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-06
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多