gpt4 book ai didi

javascript - 在 Ramda.js 中编写特定对象映射器的更简洁方法

转载 作者:行者123 更新时间:2023-11-28 17:03:04 24 4
gpt4 key购买 nike

我在 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 代替组合 filtercomplement 仍然更好。这显然是一个优越的解决方案:

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。显然这些很容易做到。

关于javascript - 在 Ramda.js 中编写特定对象映射器的更简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56791626/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com