如何更改此代码:
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'
},
答案 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 上看到这一点。