Sortiere den Hash mit dem Schlüssel als "YYYY-MM" in rails - ruby

Ich habe einen Hash mit den Schlüsseln im Format "YYYY-MM".

Ich möchte den Hash in aufsteigender Reihenfolge sortieren. Unten ist was ich möchte:

{"2013-05" => 2 , "2013-06" => 4 , "2013-07" =>10 , ... }

Antworten:

6 für die Antwort № 1
require "Date"
my_hash = {"2013-10" => 2 , "2013-06" => 4 , "2013-07" =>10}

new_hash = Hash[my_hash.sort_by{|k,_| Date.strptime(k, "%Y-%m")}]
p new_hash # => {"2013-06"=>4, "2013-07"=>10, "2013-10"=>2}

Entfernen Sie dann den Hash [] -Teil, wenn Sie möchten, dass die Ausgabe ein Array ist. Sie müssen dies tun, wenn Sie Ruby <= 1.8.7 verwenden (in älteren Versionen von Ruby haben Hashes keine definierte Reihenfolge).

Bearbeiten: Es gibt zwei Gründe, warum das Sortieren nach einem Datum besser ist als das Sortieren der Strings. Die erste ist die Validierung, um zu überprüfen, ob die Datumszeichenfolgen im Hash tatsächlich das richtige Format haben. Die zweite darin wird auch Monate ohne und eine Null hinzugefügt und behandelt, und richtig sortieren. "2013-06" und "2013-6" werden gleich behandelt, und das ist nicht der Fall, wenn Sie nur die Zeichenfolge sortieren.


0 für die Antwort № 2

Sortieren nach Schlüssel funktioniert auch:

h = {"2013-10" => 2 , "2013-06" => 4 , "2012-07" =>10}

Hash[h.sort_by{|k,_| k}]
# => {"2012-07"=>10, "2013-06"=>4, "2013-10"=>2}

#which is same as h.sort

Hash[h.sort]
# => {"2012-07"=>10, "2013-06"=>4, "2013-10"=>2}

0 für die Antwort № 3

Der einfachste Weg:

> h={"2013-10" => 2 , "2013-06" => 4 , "2013-07" =>10 }
=> {"2013-10"=>2, "2013-06"=>4, "2013-07"=>10}
> Hash[h.sort]
=> {"2013-06"=>4, "2013-07"=>10, "2013-10"=>2}

Am beliebtesten