带有数组值的Ruby哈希

noh*_*hat 1 ruby arrays hash

说我有这样的哈希

{"k1"=>["v1"], "k2"=>["v2"], "k3"=>["v3"], "k4"=>["v4"]}
Run Code Online (Sandbox Code Playgroud)

我希望它看起来像这样:

{"k1"=>"v1", "k2"=>"v2", "k3"=>"v3", "k4"=>"v4"}
Run Code Online (Sandbox Code Playgroud)

有没有比这丑陋更简单的方法inject呢?

h1 = {"k1"=>["v1"], "k2"=>["v2"], "k3"=>["v3"], "k4"=>["v4"]}
h2 = h1.inject({}){|h,v| h[v.first]=v.last.first; h}
Run Code Online (Sandbox Code Playgroud)

mae*_*ics 8

比你的"注入"解决方案更难看:

h1 = {"k1"=>["v1"], "k2"=>["v2"], "k3"=>["v3"], "k4"=>["v4"]}
h2 = Hash[*h1.map.flatten]
h2 # => {"k1"=>"v1", "k2"=>"v2", "k3"=>"v3", "k4"=>"v4"}
Run Code Online (Sandbox Code Playgroud)

正如@the Tin Man在评论中指出的那样,如果你的值数组可能有多个元素,那么你需要做一些稍微不同的事情才能使它按预期工作:

h2 = Hash[*h1.map{|k,v|[k,v[0]]}.flatten]
h2 # => {"k1"=>"v1", "k2"=>"v2", "k3"=>"v3", "k4"=>"v4"}
Run Code Online (Sandbox Code Playgroud)