Ramda函数,它接受路径列表并返回一个破坏对象的函数

时间:2018-02-05 19:21:42

标签: javascript ramda.js destructuring

你好,任何人都可以指出我有这个问题的正确方向,

基本上我有一个接受对象并对其进行解构的函数。

({ data: { accounts, loading } }) => ({
  accounts,
  loading,
})

我想创建一个ramda函数,它接受一个路径列表,深度从对象中提取值并从中返回一个对象。

实现上述相同的功能,我想使用这样的功能:

deepExtract(['data.accounts', 'data.loading'])
// input: { data: { accounts: 1, loading: 1 } }
// output: { accounts: 1, loading: 1 } (notice the keys doesn't have `data` in it.)

当前进展:

R.pipe(
  R.map(R.split('.')), // <-- gives me a list that I can feed into lensPath [['data', 'accounts'], ['data', 'loading']
  /*  Can't figure out next steps but I'd like to run each of the list to:
   *  1. lensProp
   *  2. merge
   */
)(['data.accounts', 'data.loading'])

1 个答案:

答案 0 :(得分:1)

这是一个相当简单的版本,没有您额外的拆分 - : 要求:

const deepExtract = curry((paths, obj) => {
  const fullPaths = map(split('.'), paths)
  const names = map(last, fullPaths)
  const vals = map(flip(path)(obj), fullPaths)
  return zipObj(names, vals)
})

虽然我们可以做到这一点,但它可以像这样可读,并且可能不会出现在无点版本中。

<强>更新

添加:规则会使代码变得不那么令人愉快:

const deepExtract = curry((paths, obj) => {
  const namedPaths = map(split(':'), paths)
  const fullPaths = map(pipe(head, split('.')), namedPaths)
  const names = map(ifElse(nth(1), nth(1),  pipe(head, split('.'), last)), namedPaths)
  const vals = map(flip(path)(obj), fullPaths)
  return zipObj(names, vals)
})

我还没有想过如何避免与split('.')重复。它可能没有太多困难就可以完成。但这不太可能是一个严重的性能损失,只是一个漂亮的代码问题。