簡體   English   中英

如何使用Ramda將對象映射轉換為數組?

[英]How to transform object map to array with Ramda?

我想轉換以下對象:

{
  'id-1': { prop: 'val1' },
  'id-2': { prop: 'val2' },
}

數組:

[
  { id: 'id-1', prop: 'val1' },
  { id: 'id-2', prop: 'val2' },
]

到目前為止我所做的(有效):

R.pipe(
  R.toPairs,
  R.map(([id, props]) => ({
    id,
    ...props,
  }))
)

我只想使用Ramda解決它-如果可能的話。

我建議“僅使用Ramda”解決它是一個糟糕的設計目標,除非這是學習Ramda的練習。 我是Ramda的創建者之一,也是一個忠實的擁護者,但是Ramda只是一個工具包,旨在簡化您的代碼,從而使您可以更輕松地在某些范式中工作。

也就是說,我們當然可以使用Ramda編寫此版本的無點版本。 我想到的第一件事就是這個*

 const transform = pipe( toPairs, map(apply(useWith(merge, [objOf('id'), identity]))) ) const data = {'id-1': { prop: 'val1' }, 'id-2': { prop: 'val2'}} console.log(transform(data)) 
 <script src="https://bundle.run/ramda@0.26.1"></script><script> const {pipe, toPairs, map, apply, useWith, merge, objOf, identity} = ramda </script> 

但是,這是不是你原來的,而不是更多可讀性。

這段代碼:

const transform = pipe(
  toPairs,
  map(([id, props]) => ({...props, id}))
)

是非常清晰的,而useWith版本需要一個才能理解特定於useWithobjOf並且apply objOf有些晦澀-我希望mapmergeidentity是清晰的。

實際上,這段代碼非常簡單,我很可能將它編寫為單行代碼,在這種情況下,我切換到通過pipe compose

const transform = compose(map(([id, props]) => ({...props, id})), toPairs)

但是我可能不會這樣做,因為我發現多行pipe版本更易於閱讀。

最后請注意,我們可以完全不用任何Ramda工具就能以一種易於閱讀的方式執行此操作:

const transform = (data) => 
  Object.entries(data).map(
    ([id, props]) => ({...props, id})
  )

如果我已經在代碼庫中使用Ramda,則我更希望使用上面的pipe版本。 我認為它更容易閱讀。 但是絕不會僅出於那微小的差異就將Ramda引入項目中。

我擔心人們會迷戀無點代碼。 這是一個工具。 當它使您的代碼更易於理解時使用它。 當它使您的代碼更加晦澀時,請跳過它。 在這里,我認為您是從易於閱讀的代碼開始的。 很難對此進行改進。


* 請注意 ,此處的identity並非嚴格必要; 您可以無害地跳過它。 useWith生成的沒有該identity的函數將錯誤地報告useWith為1,但是由於該函數立即被apply包裹,然后進一步放置在從toPairs接收一個包含兩個元素的數組的toPairs ,因此沒有任何依賴於那個的阿里 但是我發現無論如何都包含它是一個好習慣。

那這個呢? 可能不太詳細!

 const toArray = R.pipe( R.toPairs, R.map( R.apply(R.assoc('id')), ), ); const data = { 'id-1': { prop: 'val1' }, 'id-2': { prop: 'val2' }, }; console.log('result', toArray(data)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script> 

暫無
暫無

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

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