【问题标题】:Ramda reject - is there a more elegant way to write this?Ramda 拒绝 - 有没有更优雅的方式来写这个?
【发布时间】:2019-08-30 01:07:08
【问题描述】:
const people = [
  {
    name: 'bill',
    age: 52
  },
  {
    name: 'james',
    age: 27
  },
  {
    name: 'james',
    age: 17
  }
]

const newPeople = R.reject(person => {
  return R.includes('jam', person.name)
})(people)

有没有更优雅的 Ramda 方式来写这个?我希望返回一个数组,该数组会删除名称中包含字符串 jam 的所有人员对象。

也许是 R.reject(R.where(...)) 之类的东西?

谢谢!

【问题讨论】:

    标签: javascript functional-programming ramda.js


    【解决方案1】:

    我认为您与where 走在正确的轨道上。

    这对我来说非常好:

    const jamless = reject (where ({name: includes ('jam')}))
    
    const people = [{name: 'bill', age: 52}, {name: 'james', age: 27}, {name: 'james', age: 17}]
    
    console .log (
      jamless (people)
    )
    <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
    <script> const {reject, where, includes} = R                 </script>

    大声朗读关键词,我们可以听到“reject where name include 'jam'”,这个问题的英文描述还不错。

    如果你想参数化它,它可能只是

    const disallow = (str) => reject (where ({name: includes(str)}) )
    const jamless = disallow ('jam')
    

    (虽然我很确定我们可以制作disallow 的免费版本,但我认为没有理由尝试,因为这已经很容易阅读了。)

    另请参阅相关答案,https://stackoverflow.com/a/29256202

    【讨论】:

    • 也许表明name 也可以很容易地被参数化?
    • @user633183:当然,const disallow = (prop) =&gt; (val) =&gt; reject (where ({[prop]: includes(val)}) ),但在某个地方你也需要回到where 的一般用法;这开始突破我的界限。
    • 是的。我最终得到了R.reject(R.where({ name: R.includes('jam') }));,这正是你在这里提出的。总是很高兴得到 Ramda 开发人员的回复! :) 谢谢。
    【解决方案2】:

    我会把它分解成更小的函数:

    withJam

    如果字符串包含字符串jam,则返回true(不区分大小写)

    const withJam = R.test(/jam/i);
    withJam('Bill') //=> false
    withJam('James') //=> true
    

    nameWithJam

    如果属性包含字符串jam,则返回true(不区分大小写)

    const nameWithJam = R.propSatisfies(withJam, 'name');
    nameWithJam({name: 'Bill'}) //=> false
    nameWithJam({name: 'James'}) //=> true
    

    然后你可以写:

    R.reject(nameWithJam)(people)
    

    我认为您的初始解决方案已经足够好。我只是让它变得无意义,即没有明确提及参数。

    例子:

    假设您需要一个将5 添加到任意数字的函数:

    const add5 = n => n + 5;
    add5(37) //=> 42
    

    如果您可以使用 add 的咖喱版本,您就可以摆脱 n。我们先定义add

    const add = m => n => m + n;
    

    那么让我们创建add5:

    const add5 = add(5);
    add5(37) //=> 42
    

    你可以替换这个:

    [1,2,3].map(n => n + 5) //=> [6,7,8]
    

    与:

    [1,2,3].map(add(5)) //=> [6,7,8]
    

    ⚠️ Pointfree 风格当然很有趣,值得探索。但它也可能使事情变得不必要地复杂化:) 见When is it appropriate to choose point-free style vs a data-centric style in functional programming?

    【讨论】:

    • 这种方法绝对没有问题,而且它是一个写得很好的答案(赞成!)但我认为我的答案显示了一个更清晰的实现。
    • 同意。我很少想到使用 where。不错!
    • where 出现在五年多前关于 Ramda 的 very first article 中。而且我有时还是会忘记它。
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多