Array

2013-10-12 28 views
13

içinde Dizi dizin değerlerini korurken Array'i Hash'e dönüştürün İçinde X sayı değerine sahip bir dizi var. Aşağıdaki dizinin yalnızca 4'ü vardır, ancak dinamik olmak ve yalnızca dört dizi nesnesine sahip olmaya bağlı olmamak için kodlara ihtiyacım var.Array

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

dizi nesneleri olduğu gibi karma gibi birçok anahtar/değer çiftleri sahip olmalıdır

ve değerler:

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

ben şöyle bir karma array dönüştürmek istediğiniz Her bir nesne için 0'dan başlamalı ve 1'e kadar artmalıdır. Enumerable#each_with_index kullanma

cevap

15

:

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

@hirolau yorumladığı gibi, each_with_index.map da map.with_index olarak yazılabilir. Hash#invert kullanmak

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

GÜNCELLEME

alterantive:

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

Müthiş deneyin, buraya kadar. Bahşiş için teşekkürler. – Luigi

+3

each_with_index.map ayrıca map.with_index olarak da yazılabilir, sadece biraz daha hoş. – hirolau

+2

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

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

Güzel! Daha da kısa yapabiliriz - 'Hash [(0 ... array.size) .zip (array)] ' –

+0

Çok iyi, @Alex. Bahşiş için teşekkürler. Aralarında üç noktadan kaçınmaya eğilimliyim (golf oynarken hariç) - kaçırılması çok kolay. –

4

Diğeri:

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

Daha yeni Yakut sürümleri izin verecek:

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

bu

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