Чистое преобразование хэша {"key" => ["val1", "val2"]} в хеш {"key" => "val1", "key" => "val2"} в Ruby / Rails - PullRequest
1 голос
/ 19 января 2011

Я довольно новичок в Ruby / Rails и пытаюсь понять, как разбить хеш {"key" => ["val1", "val2"]} на хеш {"key" => "val1", "key" => "val2"}.Я чувствую, что должен сгладить хэш и каким-то образом создать новый, но я не уверен, как решить проблему.Спасибо!

РЕДАКТИРОВАТЬ: Ха-ха, показывает, как я был ослеплен деревьями, чтобы не видеть лес.Не могу поверить, что сделал такую ​​глупую ошибку.Спасибо всем, кто меня разбудил.

Ответы [ 2 ]

3 голосов
/ 19 января 2011

Вы не можете иметь дубликаты ключей в Hash.

Кроме того, почему в мире вы хотели бы сделать это? ИМХО, как у вас сейчас это прекрасно, прекрасно.

2 голосов
/ 19 января 2011

Хэш по определению не может иметь один и тот же ключ более одного раза.Вместо этого вы хотите использовать массив массивов?

[['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) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...