在 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)

我认为这确实简化了原版,所以它可能很有用。但我宁愿以不同的方式编码条件,而不求助于 ifElsecond 或其他命令式函数。

我们真正想要做的是仅包含源对象中存在的那些属性。包含列表的子集是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>

虽然我们当然可以找到一种方法使它完全没有意义,但我发现它的可读性很好。