我想转换以下对象:
{
'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来解决它。
答案 0 :(得分:3)
我建议“仅使用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的useWith
和objOf
并稍微模糊apply
-我希望map
, merge
和identity
清晰可见。
实际上,这段代码非常简单,我很可能将它写成单行代码,在这种情况下,我会在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
的函数将错误地报告1的偶数,但是由于该函数立即被apply
包装,然后进一步放置在接收到2的上下文中, toPairs
中的元素数组,没有任何东西依赖于那个arity。但是我发现无论如何都包含它是一个好习惯。
答案 1 :(得分:1)
这是什么? 可能不太详细!
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>