在Ruby中使用Hash反转?

cjm*_*671 6 ruby arrays hash

我有一个格式的哈希:

{key1 => [a, b, c], key2 => [d, e, f]}
Run Code Online (Sandbox Code Playgroud)

我想最终得到:

{ a => key1, b => key1, c => key1, d => key2 ... }
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最简单方法是什么?

我正在使用Ruby on Rails.

UPDATE

好吧,我设法从服务器日志中提取真实对象,它是通过AJAX推送的.

  Parameters: {"status"=>{"1"=>["1", "14"], "2"=>["7", "12", "8", "13"]}}
Run Code Online (Sandbox Code Playgroud)

fl0*_*00r 7

hash = {:key1 => ["a", "b", "c"], :key2 => ["d", "e", "f"]}
Run Code Online (Sandbox Code Playgroud)

第一个变种

hash.map{|k, v| v.map{|f| {f => k}}}.flatten
#=> [{"a"=>:key1}, {"b"=>:key1}, {"c"=>:key1}, {"d"=>:key2}, {"e"=>:key2}, {"f"=>:key2}] 
Run Code Online (Sandbox Code Playgroud)

要么

hash.inject({}){|h, (k,v)| v.map{|f| h[f] = k}; h}
#=> {"a"=>:key1, "b"=>:key1, "c"=>:key1, "d"=>:key2, "e"=>:key2, "f"=>:key2} 
Run Code Online (Sandbox Code Playgroud)

UPD

好的,你的哈希是:

hash = {"status"=>{"1"=>["1", "14"], "2"=>["7", "12", "8", "13"]}}
hash["status"].inject({}){|h, (k,v)| v.map{|f| h[f] = k}; h}
#=> {"12"=>"2", "7"=>"2", "13"=>"2", "8"=>"2", "14"=>"1", "1"=>"1"}
Run Code Online (Sandbox Code Playgroud)