javascript - 在 Ramda.js 中编写特定对象映射器的更简洁方法
问题描述
我在 Ramda 中编写了一个映射器,它简化了一个对象并删除了具有空数组的属性。这是一件非常简单的事情,但我必须放在一起的 Ramda 辅助方法会导致我在几周后研究该函数时摸不着头脑。
我想知道是否有更清洁的方法来达到相同的结果。
这是代码:
const filters = {
Brand: [],
BusinessUnit: [
{
FilterName: 'BusinessUnit',
KeyItem: 'Beauty'
},
{
FilterName: 'BusinessUnit',
KeyItem: 'Sports'
}
],
Category: [],
SKU: [
{
FilterName: 'SKU',
KeyItem: '9023'
}
]
}
const expectedFilters = {
BusinessUnit: ['Beauty', 'Sports'],
SKU: ['9023']
};
///////////////////////////////////////////////
// is there any way to write it cleaner
const result = R.compose(
R.pickBy(R.pipe(R.isEmpty, R.not)),
R.map(R.map(R.prop('KeyItem')))
)(filters);
///////////////////////////////////////////////
console.log('(expectedFilters:: ', expectedFilters);
console.log('result:: ', result);
console.log('is equal? ', R.equals(expectedFilters, result)); // true
这是在Stackblitz上运行的代码的链接。
解决方案
更新
@codepic指出,这仍然更好,reject
而不是组合filter
and complement
。这是一个明显优越的解决方案:
const transform = pipe (
reject (isEmpty),
map (pluck ('KeyItem') )
)
const filters = {Brand: [], BusinessUnit: [{FilterName: 'BusinessUnit', KeyItem: 'Beauty'}, {FilterName: 'BusinessUnit', KeyItem: 'Sports'}], Category: [], SKU: [{FilterName: 'SKU', KeyItem: '9023'}]}
console .log (
transform (filters)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script> const {pipe, reject, isEmpty, map, pluck} = R </script>
原始答案
肯定有一些清理工作。我认为complement (isEmpty)
比pipe (isEmpty, not)
. 并map (prop ('foo') )
具有内置功能,pluck ('foo')
. 虽然pickBy
可以正常工作,但它在前一段时间变得多余,因为filter
它将涵盖对象和数组。
所以我的(现在已经过时的)版本看起来像这样:
const transform = pipe (
filter (complement (isEmpty) )
map (pluck ('KeyItem') )
)
const filters = {Brand: [], BusinessUnit: [{FilterName: 'BusinessUnit', KeyItem: 'Beauty'}, {FilterName: 'BusinessUnit', KeyItem: 'Sports'}], Category: [], SKU: [{FilterName: 'SKU', KeyItem: '9023'}]}
console .log (
transform (filters)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script> const {pipe, filter, complement, isEmpty, map, pluck} = R </script>
当然,对于提取complement (isEmpty)
到notEmpty
并且可能提取filter (notEmpty)
到类似removeEmpties
. 显然,这些很容易做到。
推荐阅读
- css - CSS网格不考虑minmax中的最小值以及自动调整
- c++ - 有没有办法可以将字符串写入文件?
- c# - 手动杀死线程,之前创建
- python - Tensorflow 2.0:如何在使用 tf.saved_model 时更改输出签名
- node.js - 无法在 Electron 应用程序的 NPM 依赖项中使用加密
- django - 在呈现响应之前删除消息
- javascript - 即使在重新加载后,您如何将您的帖子数据保存在您的博客上?
- java - 托管代理 web 应用程序的 Tomcat 在正确运行一段时间后生成 SSLHandshakeException
- kubernetes - istio 服务可以用于任意主机名吗?
- algorithm - 生成排列 - 交换函数