将Ruby哈希转换为数组

10

我有一个哈希(Hash),格式如下:

{:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}

如何将其转换为以下格式:

{:a => [["aa",11],["ab",12]],:b=>[["ba",21],["bb",22]]}

如果你正在使用多级哈希表并且想要将它们展开,请查看我的HashModel gem: https://rubygems.org/gems/hashmodel,你可以在github上获取源代码: https://github.com/mikbe/hashmodel - Mike Bethany
3个回答

28

如果你想修改原始哈希,则可以执行以下操作:

hash.each_pair { |key, value| hash[key] = value.to_a }

来自Hash#to_a的文档:

将hsh转换为包含[key,value]数组的嵌套数组。

h = { "c" => 300, "a" => 100, "d" => 400, "c" => 300 }

h.to_a #=> [["c", 300], ["a", 100], ["d", 400]]


谢谢@mikej。非常好用,不过我想知道hash.each和hash.each_pair之间的区别是什么? - Aditya Manohar
3
如果您不想修改原始哈希值,可以使用以下代码:new_hash = hash.inject({}) { |h, (key, value)| h[key] = value.to_a; h }。此代码将创建一个新的哈希值,并将原哈希值中的键和值转换为数组格式,然后存储在新哈希值中,而不会更改原始哈希值。 - Thiago Silveira
1
@Aditya:如果你想让你的块获得两个参数,使用 each_pair。如果只是为了可读性。 - Christopher Creutzig

4
这里提供另一种方法来完成此任务:
hsh = {:a => {"aa" => 11,"ab" => 12}, :b => {"ba" => 21,"bb" => 22}}
hsh.each{|k,v| hsh[k]=*v}
# => {:a=>[["aa", 11], ["ab", 12]], :b=>[["ba", 21], ["bb", 22]]}

0
hash.collect {|a, b|  [a, hash[a].collect {|c,d| [c,d]}] }.collect {|e,f| [e => f]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接