[英]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
版本需要一個才能理解特定於useWith
和objOf
並且apply
objOf
有些晦澀-我希望map
, merge
和identity
是清晰的。
實際上,這段代碼非常簡單,我很可能將它編寫為單行代碼,在這種情況下,我切換到通過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.