gpt4 book ai didi

javascript - 如何使用 Ramda 将对象映射转换为数组?

转载 作者:行者123 更新时间:2023-11-30 09:14:48 24 4
gpt4 key购买 nike

我想从以下对象进行转换:

{
'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 只是一个工具包,旨在简化您的代码,使其更容易在特定范例中工作。

也就是说,我们当然可以使用 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}))
)

非常清晰,而 Ramda 版本需要一个人理解 Ramda 特定的 useWithobjOf 并且稍微晦涩的 apply -- 我希望mapmergeidentity 是清楚的。

事实上,这段代码非常简单,我可以将它写成一行代码,在这种情况下,我切换到 compose 而不是 pipe:

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 会错误地报告 arity 为 1,但由于该函数立即被 apply 包裹,然后进一步放置在从 toPairs 接收双元素数组的上下文中,没有任何依赖于该元数的内容。但我发现不管怎样都包含它是一个好习惯。

关于javascript - 如何使用 Ramda 将对象映射转换为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55828624/

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