2013-10-12 16 views
13

我有一個數組,其中包含的數值爲X。下面的數組只有4個,但我需要的代碼是動態的,不依賴於只有四個數組對象。將數組轉換爲散列,同時保留紅寶石中的數組索引值

array = ["Adult", "Family", "Single", "Child"]

我想array轉換爲一個哈希看起來像這樣:

hash = {0 => 'Adult', 1 => 'Family', 2 => 'Single', 3 => 'Child'}

哈希應該有儘可能多的鍵/值對數組的對象,和值應該從0開始併爲每個對象增加1。

回答

15

使用Enumerable#each_with_index

Hash[array.each_with_index.map { |value, index| [index, value] }] 
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 

由於@hirolau評論,each_with_index.map也可以寫爲map.with_index

Hash[array.map.with_index { |value, index| [index, value] }] 
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 

UPDATE

Alterantive使用Hash#invert

Hash[array.map.with_index{|*x|x}].invert 
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
Hash[[*array.map.with_index]].invert 
# => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
+0

真棒,這就行了。謝謝你的提示。 – Luigi

+3

each_with_index.map也可以寫成map.with_index,只是更好。 – hirolau

+2

Hash [array.map.with_index {| * x | x}]。invert – hirolau

1
Hash[*(0..array.size-1).to_a.zip(array)] 
    => {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
+4

不錯!我們可以使它更短 - 哈希[(0 ... array.size).zip(array)]' –

+0

非常好,@Alex。謝謝你的提示。我傾向於在範圍內避免三個點(高爾夫球除外) - 太容易錯過。 –

4

還有一句:

Hash[array.each_index.zip(array)] 
#=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 

較新的Ruby版本將允許:

array.each_with_index.to_h.invert 
#=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"} 
0

試試這個

array.each_with_index.inject({}){ |hash, (val, i)| hash[i]=val; hash } 
=> {0=>"Adult", 1=>"Family", 2=>"Single", 3=>"Child"}