2015-01-21 9 views
0

здесь рубин хэшконвертировать рубин хэш в другой формат

hash = {"ss"=>1, "bc/gf"=>"120/22", "bb"=>"hh"} 

Я хочу, чтобы преобразовать его в

{"ss"=>1, "bc"=>"120", "gf" => "22", "bb"=>"hh"} 

что я пытался

key_arr = has.keys.map{|s| s.split("/")}.flatten 
val_arr = has.values.map(&:to_s).map{|s| s.split("/")}.flatten 
Hash[*key_arr.zip(val_arr).flatten] 

отлично работает для меня .. но есть ли более элегантное решение моей проблемы

+3

Существует дублированный ключ: 'bb'. Хэш-ключи должны быть уникальными. – falsetru

+0

'есть более элегантное решение моей проблемы' - я думаю, главная проблема здесь в том, что вы не видите свою настоящую проблему. Это не то, как преобразовать этот хеш, но именно поэтому вы получаете хэш, как этот на первом месте. Откуда берется входной хеш? Почему это так странно отформатировано? – BroiSatse

+0

@falsetru обновил вопрос – aelor

ответ

2

Используя Enumerable#each_with_object:

hash = {"ss"=>1, "bc/gf"=>"120/22", "bb"=>"hh"} 
hash.each_with_object({}) { |(key, value), h| 
    value = value.to_s 
    key.split('/').zip(value.split('/')) { |k, v| 
    h[k] = v 
    } 
} 
# {"ss"=>"1", "bc"=>"120", "gf"=>"22", "bb"=>"hh"} 
+1

Неверное значение для gf. Это «120/22», должно быть «22». – BroiSatse

+0

@BroiSatse, Спасибо, что указали это. обновлено согласно вам. – falsetru

+0

@falsetru благодарит много друзей – aelor

0
hash = {"ss"=>1, "bb/gf"=>"120/22", "bb"=>"hh"} 
hash2 = hash.inject({}) do |h, (key, value)| 
    h.merge([ key.to_s.split('/'), value.to_s.split('/')].transpose.to_h) 
end 
+0

Просьба пояснить ваше решение :) – Severin

Смежные вопросы