干净地转换{“key”=> [“val1”,“val2”]}散列到{“key”=> “val1”,“key”=> Ruby / Rails中的“val2”}哈希

时间:2011-01-19 20:05:30

标签: ruby hash

我是Ruby / Rails的新手,我正在试图弄清楚如何将{"key" => ["val1", "val2"]}哈希拆分为{"key" => "val1", "key" => "val2"}哈希。我觉得我应该压扁哈希并以某种方式建立一个新的,但我不确定如何解决问题。谢谢!

编辑:哈哈,看到我在树林里看不到森林是多么盲目。简直不敢相信我犯了这么傻的错误。感谢所有让我震撼的人。

2 个答案:

答案 0 :(得分:3)

Hash中无法拥有重复的密钥。

另外,为什么世界上你想要这样做?恕我直言,你现在拥有它的方式非常好。

答案 1 :(得分:2)

根据定义,哈希不能同时出现相同的密钥。你会不会喜欢数组数组?

[['key','val1'],['key','val2']]

如果是这样,并且如果每个散列键都是一个值数组,那么你可以这样做:

devalues = { a:[1,2,3], b:[4], c:[5,6] }
exploded = devalues.map{ |k,vs| ([k]*vs.length).zip(vs) }.flatten(1)
p exploded
#=> [[:a, 1], [:a, 2], [:a, 3], [:b, 4], [:c, 5], [:c, 6]]

请注意,flatten(1)仅为Ruby 1.8.7+

修改:根据下面Nakilon的评论,这可能更简单in Ruby 1.9.2+

exploded = devalues.flat_map{ |k,vs| ([k]*vs.length).zip(vs) }

修改:或者根据@ tokland的评论,使用Array#product更短/更好:

exploded = devalues.flat_map{ |k,vs| [k].product(vs) }