2013-08-27 152 views
2

我是Ruby中的新手,我正在努力学习Ruby。我是通过哈希今天去和被困在相关问题哈希Ruby哈希创建

我有以下哈希

{"key1" => ["param_1","param_2"], "key2" => ["param_3","param_4"], "key3" => "param_5", "key4" => "param_6","key5" => ["param_7","param_8"]} 

,我想上面的散列转换成以下。

{"my_hash" => [ {"name" => "key1","value" => ["param_1","param_2"]}, 
       {"name" => "key2","value" => ["param_3","param_4"]}, 
       {"name" => "key3","value" => ["param_5"]}, 
       {"name" => "key4","value" => ["param_6"]}, 
       {"name" => "key5","value" => ["param_7","param_8"]} 
       ] 
} 

有人可以告诉我如何以有效的方式在Ruby中做到这一点。

回答

3
hsh = {"key1" => ["param_1","param_2"], 
     "key2" => ["param_3","param_4"], "key3" => "param_5", 
     "key4" => "param_6","key5" => ["param_7","param_8"]} 
hsh.map{|k,v| {name: k,value: Array(v) }} 
# => [{:name=>"key1", :value=>["param_1", "param_2"]}, 
#  {:name=>"key2", :value=>["param_3", "param_4"]}, 
#  {:name=>"key3", :value=>["param_5"]}, 
#  {:name=>"key4", :value=>["param_6"]}, 
#  {:name=>"key5", :value=>["param_7", "param_8"]}] 

hsh = {"key1" => ["param_1","param_2"], 
     "key2" => ["param_3","param_4"], "key3" => "param_5", 
     "key4" => "param_6","key5" => ["param_7","param_8"]} 
hsh.map{|k,v| {"name" => k,"value" => Array(v) }} 
# => [{"name"=>"key1", "value"=>["param_1", "param_2"]}, 
#  {"name"=>"key2", "value"=>["param_3", "param_4"]}, 
#  {"name"=>"key3", "value"=>["param_5"]}, 
#  {"name"=>"key4", "value"=>["param_6"]}, 
#  {"name"=>"key5", "value"=>["param_7", "param_8"]}] 
+1

注意,这个答案使用的符号,而不是字符串键,例如':name'而不是''name“'。使用符号作为键是Ruby的标准。如果您试图生成可轻松导出为[JSON](http://en.wikipedia.org/wiki/JSON)的哈希,那么您(提问者)应该只需要字符串。 –

+0

而不是'value:v.is_a?(Array)? v:[v]',你可以使用['#to_a'](http://www.ruby-doc.org/core/Array.html#method-i-to_a),比如'value:v.to_a '。 'to_a'通过将值包装到数组中,将值转换为[Array](http://www.ruby-doc.org/core/Array.html),除非它已经是一个Array。 –

+3

@ RoryO'Kane你不能依赖为任意对象定义的'to_a'方法。 '[v] .flatten'可能是一种更宽容的方法。 – tadman