2016-05-25 6 views
1

Hier ist die Hashes, die verarbeitet werden:Wie Hashes zu organisieren, indem Eigenschaft

{ 
     "flatiron school bk" => { 
     :location => "NYC" 
     }, 
     "flatiron school" => { 
     :location => "NYC" 
     }, 
     "dev boot camp" => { 
     :location => "SF" 
     }, 
     "dev boot camp chicago" => { 
     :location => "Chicago" 
     }, 
     "general assembly" => { 
     :location => "NYC" 
     }, 
     "Hack Reactor" => { 
     :location => "SF" 
     } 
} 

ich diese Hashes nach Ort organisieren müssen, wie folgt aus:

{ "NYC"=>["flatiron school bk", "flatiron school", "general assembly"], 
    "SF"=>["dev boot camp", "Hack Reactor"], 
    "Chicago"=>["dev boot camp chicago"]} 
} 

Antwort

2

Sie each_with_object verwenden können, kombinieren in in neuen Hash:

hash.each_with_object({}) do |(name, data), res| 
    (res[data[:location]] ||= []) << name 
end 

Erläuterung:

each_with_object Iteriert den angegebenen Block für jedes Element mit einem beliebigen Objekt und gibt das anfänglich angegebene Objekt zurück.

In diesem Fall sind Name und Daten Schlüssel und Wert jedes Elements in gegebenem Hash. In (res[data[:location]] ||= []) << name erhalten Sie Speicherort, erstellen Array im Ergebnis-Hash für den angegebenen Speicherort (wenn es nicht existiert), dann legen Sie den Schlüssel der Eingabe-Hash zu ihm.

+0

danke! Kannst du erklären, wie es funktioniert? –

+1

@StevenKwok Erklärung hinzufügen –

+0

hab es geschafft! Danke vielmals! –

Verwandte Themen