以无点的方式使用Ramda map helper

时间:2017-09-12 07:08:04

标签: javascript functional-programming ramda.js pointfree

如何更改此代码:

 map(user => assoc('isAdult', isAdult(user), user)

功能无点(使用Ramda)。我正在考虑如何使用useWith进行操作,但无法找到可行的实现方法。

有什么想法吗?

import { pipe, prop, gte, __, map, assoc, sortWith, descend } from 'ramda'

const isAdult = pipe(
  prop('age'),
  gte(__, 18)
)

const func = pipe(
  map(user => assoc('isAdult', isAdult(user), user)),
  sortWith([
    descend(prop('isAdult')),
    descend(prop('age')),
  ])
)

export default func

编辑(更多信息):

我想创建一个函数,返回由isAdult键扩展的对象数组。如果用户年龄超过18岁,我们会将标记设置为true

此外,该函数应返回按标志isAdult排序的用户,然后按键age排序。

示例数据:

const data1 = [
  {
    name: 'Cassidy David',
    email: 'sit@Nullaeuneque.co.uk',
    id: 'FC92BF1E-A6FD-E5C1-88AB-183BD1BC59C5',
    position: 1,
    age: 53,
    created_at: '2017-04-07'
  },
  {
    name: 'Gwendolyn Edwards',
    email: 'ut.mi.Duis@elementumsemvitae.net',
    id: '00000001-ED9D-3A88-0D3C-07A148FD43ED',
    position: 2,
    age: 10,
    created_at: '2016-05-21'
  },

2 个答案:

答案 0 :(得分:3)

好吧,我得到了一个解决方案,尽管这是否比你已经提高的清晰度有了明显的改善:

const newFields = map(pipe(isAdult, objOf('isAdult')))(data1)
zipWith(merge, data1, newFields)

所以我正在做一个额外的传递,我生成一个包含刚刚拥有新密钥的对象的列表并将它们合并在一起,然后我将这些列表组合在一起。

我无法得到一个解决方案,你可以在没有像你所做的那样避免箭头功能的情况下进行一次传递。

编辑:Scott Sauyet的解决方案实际上解决了这个问题

答案 1 :(得分:3)

我认为尝试使这一点免费是否有用是值得商榷的。

这是可读的:

map(user => assoc('isAdult', isAdult(user), user)),

无点技术是一种很好的技术,有时可以提高可读性。但如果它没有,我就不会为此烦恼。

那就是说,如果你想尝试无点,chain可能是最有帮助的。请注意链如何用于函数:chain(f, g)(x) //=> f(g(x), x)

所以你可以把你的相关部分写成

map(chain(assoc('isAdult'), isAdult))

您可以在 Ramda REPL 上看到这一点。