2016-06-06 18 views
-8

Ich habe ein Array von ArraysRails/Rubin machen neue Hash

arr = [ 
['category','subcat','detail'],['category1','subcat1','detail1'] 
] 

ich einen Hash machen wollen es {'category'=>'category','subcat'=>'subcat','detail'=>'detail'}...,other hashes from array

hash={} 

, was ich es tue, ist

arr.each{|el| 
hash['category'] = el[0]; 
hash['subcat'] = el[1]; 
hash['detail'] = h[2]; 
} 

, aber es gibt nur das letzte Element zurück

hash=>{category:'category1',subcat:'subcat1',detail:'detail1'}

, wenn ich es mit den bestehenden Hash-Schlüssel tun es funktioniert perfekt, aber wenn ich versuche, neue Schlüssel -doesn't Arbeit zu setzen

Wie es zu beheben ?

+0

Bitte korrigieren Sie Ihren Beispielcode, es funktioniert nicht. (BTW, ': category' ist nicht äquivalent zu' 'category'') – Stefan

+0

Wird es immer genau zwei Sub-Arrays in' arr' geben? –

+0

@ Jordan, könnte es eine Menge von Arrays – user

Antwort

2

Sie können Array#transpose in Kombination mit Array#to_h verwenden. Wenn Sie mich nicht, wenn die Schlüssel des Hash-Strings sind, dann können Sie einfach tun:

arr.transpose.to_h # => {"category"=>"category1", "subcat"=>"subcat1", "detail"=>"detail1"} 

Wenn Sie die Tasten müssen Symbole werden dann müssen Sie ein wenig mehr Arbeit tun:

arr.transpose.to_h.inject({}){|hash, (k,v)| hash[k.to_sym] = v; hash } 
3

Hashes können nur eindeutige Schlüssel haben, Duplikate sind nicht erlaubt. Wenn Sie ein Duplikat einfügen überschreiben Sie alle zuvor mit dem gleichen Namen vorhandenen Schlüssel:

Meditate dazu:

foo = {} # => {} 
foo['a'] = 1 
foo # => {"a"=>1} 

foo jetzt ein Hash von einem einzigen Schlüssel/Wert-Paar ist. Wenn ich versuche, ein anderes Element mit dem gleichen Schlüssel hinzuzufügen ich den vorherigen Wert nur überschreiben, ich nicht hinzufügen, einen anderen Schlüssel/Wert-Paar:

foo['a'] = 2 
foo # => {"a"=>2} 

Dies ist im Wesentlichen, was Sie tun mit:

arr.each{|el| 
    hash['category'] = el[0]; 
    hash['subcat'] = el[1]; 
    hash['detail'] = h[2]; 
} 

Um Ihren Code arbeiten zu lassen, müssen Sie verschiedene Namen für die Schlüssel für jede Iteration durch die Schleife finden.

Ich kann zwar einen anderen Schlüssel/Wert hinzu:

foo['b'] = 3 
foo # => {"a"=>2, "b"=>3} 

the documentation See oder jede Ruby-Hash-Tutorial für weitere Informationen.

Verwandte Themen