我試圖讓這個對象,通過AJAX傳遞:紅寶石哈希圖?
Parameters: {"status"=>{"1"=>["14", "1"], "2"=>["7", "8", "12", "13"]}}
成類似:
14 -> 1
1 -> 1
7 -> 2
了,我可以迭代。
達到此目的最優雅的方式是什麼?
我試圖讓這個對象,通過AJAX傳遞:紅寶石哈希圖?
Parameters: {"status"=>{"1"=>["14", "1"], "2"=>["7", "8", "12", "13"]}}
成類似:
14 -> 1
1 -> 1
7 -> 2
了,我可以迭代。
達到此目的最優雅的方式是什麼?
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]
input = {"1"=>["14", "1"], "2"=>["7", "8", "12", "13"]}
output = Hash[*input.map{|k,l|l.map{|v|[v,k]}}.flatten]
=> {"14"=>"1", "1"=>"1", "7"=>"2", "8"=>"2", "12"=>"2", "13"=>"2"}
output.each {|k,v| puts "#{k} -> #{v}"}
14 -> 1
1 -> 1
7 -> 2
8 -> 2
12 -> 2
13 -> 2
情侶其他變體,使用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"}
這樣的區別是什麼? http://stackoverflow.com/questions/7513730/hash-invert-in-ruby – fl00r