繁体   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