红宝石中的哈希地图?

cjm*_*671 2 ruby hash ruby-on-rails

我试图通过AJAX传递这个对象:

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

变成这样的东西:

14 -> 1
1 -> 1
7 -> 2
Run Code Online (Sandbox Code Playgroud)

我可以迭代.

实现这一目标的最优雅方式是什么?

Mat*_*att 6

flat_inverse = {}
parameters["status"].each { |key, values| values.each { |v| flat_inverse[v] = key } }

flat_inverse
# {"14"=>"1", "1"=>"1", "7"=>"2", "8"=>"2", "12"=>"2", "13"=>"2"}

#or more functional
Hash[*parameters["status"].map { |k, vs| vs.zip([k] * v.length) }.flatten]
Run Code Online (Sandbox Code Playgroud)


Mla*_*vić 5

结合其他变种,使用product:

input.map{|k,v| Hash[v.product([k])]}.inject(&:merge)
# => {"14"=>"1", "1"=>"1", "7"=>"2", "8"=>"2", "12"=>"2", "13"=>"2"} 
Hash[input.map{|k,v| v.product([k])}.flatten(1)]
# => {"14"=>"1", "1"=>"1", "7"=>"2", "8"=>"2", "12"=>"2", "13"=>"2"} 
Run Code Online (Sandbox Code Playgroud)