以无点方式使用 Ramda 地图助手
Using Ramda map helper in pointfree way
如何更改此代码:
map(user => assoc('isAdult', isAdult(user), user)
实现 pointfree 功能(使用 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
键扩展的 returns 对象数组的函数。如果用户超过 18 岁,我们将标志设置为 true
.
此外,该函数应该 return 用户按标志 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'
},
好的,我找到了一个解决方案,尽管这是否比您已有的更清晰还值得商榷:
const newFields = map(pipe(isAdult, objOf('isAdult')))(data1)
zipWith(merge, data1, newFields)
所以我做了一个额外的过程,我生成一个列表,其中包含只有新键的对象并将它们合并在一起,然后我合并列表。
我无法找到一个解决方案,在这种情况下,您可以在不避免使用像您所做的那样的箭头功能的情况下执行一次。
编辑:Scott Sauyet 的解决方案实际上很好地解决了这个问题
我认为试图让这个点免费是否有用是值得商榷的。
这是相当可读的:
map(user => assoc('isAdult', isAdult(user), user)),
无点是一项伟大的技术,有时可以提高可读性。但如果不是,我也不会理会它。
也就是说,如果您确实想尝试免积分,chain
可能最有帮助。注意函数链是如何工作的:chain(f, g)(x) //=> f(g(x), x)
.
所以你可以把你的相关部分写成
map(chain(assoc('isAdult'), isAdult))
您可以在 Ramda REPL.
上看到实际效果
如何更改此代码:
map(user => assoc('isAdult', isAdult(user), user)
实现 pointfree 功能(使用 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
键扩展的 returns 对象数组的函数。如果用户超过 18 岁,我们将标志设置为 true
.
此外,该函数应该 return 用户按标志 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'
},
好的,我找到了一个解决方案,尽管这是否比您已有的更清晰还值得商榷:
const newFields = map(pipe(isAdult, objOf('isAdult')))(data1)
zipWith(merge, data1, newFields)
所以我做了一个额外的过程,我生成一个列表,其中包含只有新键的对象并将它们合并在一起,然后我合并列表。
我无法找到一个解决方案,在这种情况下,您可以在不避免使用像您所做的那样的箭头功能的情况下执行一次。
编辑:Scott Sauyet 的解决方案实际上很好地解决了这个问题
我认为试图让这个点免费是否有用是值得商榷的。
这是相当可读的:
map(user => assoc('isAdult', isAdult(user), user)),
无点是一项伟大的技术,有时可以提高可读性。但如果不是,我也不会理会它。
也就是说,如果您确实想尝试免积分,chain
可能最有帮助。注意函数链是如何工作的:chain(f, g)(x) //=> f(g(x), x)
.
所以你可以把你的相关部分写成
map(chain(assoc('isAdult'), isAdult))
您可以在 Ramda REPL.
上看到实际效果