2011-09-22 194 views
2

我試圖讓這個對象,通過AJAX傳遞:紅寶石哈希圖?

Parameters: {"status"=>{"1"=>["14", "1"], "2"=>["7", "8", "12", "13"]}} 

成類似:

14 -> 1 
1 -> 1 
7 -> 2 

了,我可以迭代。

達到此目的最優雅的方式是什麼?

+2

這樣的區別是什麼? http://stackoverflow.com/questions/7513730/hash-invert-in-ruby – fl00r

回答

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] 
+0

這是否保證原始列表的順序被保留? – cjm2671

+1

在1.9.2中保存順序。如果你想要一個保存順序的數據結構,哈希(通常)不是你正在尋找的。也許是一個關聯數組。 – Serabe

1
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 
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"}