我有一个哈希数组,如下所示:
[{"testPARAM1"=>"testVAL1"}, {"testPARAM2"=>"testVAL2"}]
字符串
我试着把它Map到一个散列上,像这样:
{"testPARAM2"=>"testVAL2", "testPARAM1"=>"testVAL1"}
型
我已经用
par={}
mitem["params"].each { |h| h.each {|k,v| par[k]=v} }
型
但我想知道是否可以用更习惯的方式来实现这一点(最好不使用局部变量)。
我该怎么办?
6条答案
按热度按时间6rqinv9w1#
您可以组合
Enumerable#reduce
和Hash#merge
来实现您想要的功能。字符串
减少数组有点像在每个元素之间插入一个方法调用。
例如,
[1, 2, 3].reduce(0, :+)
就像说0 + 1 + 2 + 3
,并给出6
。在我们的例子中,我们做了类似的事情,但是使用了合并函数,它合并了两个哈希。
型
yi0zb3m42#
怎么样:
字符串
ktecyv1j3#
到目前为止,每个答案都建议使用
Enumerable#reduce
(或inject
,这是一个别名)+Hash#merge
,但要注意,虽然干净,简洁和人类可读,但这个解决方案将非常耗时,并且在大型数组上占用大量内存。我编制了不同的解决方案并对其进行了基准测试。
一些选项
字符串
基准脚本
使用bmbm而不是
bm
很重要,以避免由于内存分配和垃圾收集的成本而导致的差异。型
注意:我最初使用1_000_000项目数组进行了测试,但由于
reduce + merge
的花费是指数级的,所以它将花费很多时间来结束。基准测试结果
50k项数组
型
2M项数组(不含
reduce + merge
)型
kulphzqa4#
使用#inject
字符串
lokaqttq5#
2023年更新:
Ruby 3中的merge方法现在支持多个参数。这意味着,我们可以提供多个哈希,它们将被合并在一起。
字符串
如果你有一个哈希数组,你可以使用splat运算符来分散参数:
型
eoigrqb66#
在这里,您可以使用inject或Enumerable类中的reduce,因为它们都是彼此的别名,因此没有性能优势。
字符串