簡體   English   中英

Ramda 函數接受路徑列表並返回一個解構對象的函數

[英]Ramda function that takes in list of paths and returns a function that destructures an object

你好,任何人都可以指出我遇到的這個問題的正確方向,

基本上我有一個函數可以接收一個對象並對其進行解構。

({ 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'])

這是一個相當簡單的版本,沒有額外的split-on- :要求:

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('.')重復。 它可能沒有太大的困難就可以完成。 但這不太可能嚴重影響性能,只是代碼漂亮的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM