Хэш по определению не может иметь один и тот же ключ более одного раза.Вместо этого вы хотите использовать массив массивов?
[['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+
Редактировать : согласно комментарию Накилона ниже, это может быть проще в 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) }