在 Ramda 中重写这个函数
Rewrite this function in Ramda
我想知道我是否可以使用 Ramda 的函数式风格重写这个函数,但是怎么做呢?
有人可以提供一些途径吗?
function copyProps(object, props) {
return props.reduce(
(acum, current) =>
object[current] !== undefined && object[current] !== null ? { ...acum, [current]: object[current] } : acum,
{}
)
}
用法示例:
user = {
email: 'mail@example.com'
another: 'property'
}
const result = copyProps(user, ['email', 'displayName'])
console.log(result) // { email: 'mail@example.com' }
如评论中所述,这已作为 pick
.
包含在 Ramda 中
但如果您想自己推出,我们可以通过多种方式实现。
一种是直接翻译您的代码,只需使用一些 Ramda 函数:
const copyProps = (props) => (obj) =>
reduce ((a, p) => has (p) (obj) ? assoc (p, obj [p], a) : a, {}) (props)
我认为这确实简化了原版,所以它可能很有用。但我宁愿以不同的方式编码条件,而不求助于 ifElse
、cond
或其他命令式函数。
我们真正想要做的是仅包含源对象中存在的那些属性。包含列表的子集是filter
的重点,所以我宁愿这样写:
const copyProps = (props) => pipe (
toPairs,
filter (pipe (head, includes (__, props))),
fromPairs
)
const user = {
email: 'mail@example.com',
another: 'property',
whichIs: 'skipped',
id: 'fred',
}
console .log (
copyProps (['email', 'displayName', 'id']) (user)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>
<script> const {pipe, toPairs, filter, head, includes, __, fromPairs} = R </script>
虽然我们当然可以找到一种方法使它完全没有意义,但我发现它的可读性很好。
我想知道我是否可以使用 Ramda 的函数式风格重写这个函数,但是怎么做呢?
有人可以提供一些途径吗?
function copyProps(object, props) {
return props.reduce(
(acum, current) =>
object[current] !== undefined && object[current] !== null ? { ...acum, [current]: object[current] } : acum,
{}
)
}
用法示例:
user = {
email: 'mail@example.com'
another: 'property'
}
const result = copyProps(user, ['email', 'displayName'])
console.log(result) // { email: 'mail@example.com' }
如评论中所述,这已作为 pick
.
但如果您想自己推出,我们可以通过多种方式实现。
一种是直接翻译您的代码,只需使用一些 Ramda 函数:
const copyProps = (props) => (obj) =>
reduce ((a, p) => has (p) (obj) ? assoc (p, obj [p], a) : a, {}) (props)
我认为这确实简化了原版,所以它可能很有用。但我宁愿以不同的方式编码条件,而不求助于 ifElse
、cond
或其他命令式函数。
我们真正想要做的是仅包含源对象中存在的那些属性。包含列表的子集是filter
的重点,所以我宁愿这样写:
const copyProps = (props) => pipe (
toPairs,
filter (pipe (head, includes (__, props))),
fromPairs
)
const user = {
email: 'mail@example.com',
another: 'property',
whichIs: 'skipped',
id: 'fred',
}
console .log (
copyProps (['email', 'displayName', 'id']) (user)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js"></script>
<script> const {pipe, toPairs, filter, head, includes, __, fromPairs} = R </script>
虽然我们当然可以找到一种方法使它完全没有意义,但我发现它的可读性很好。