2012-05-25 5 views
6

Ich weiß, dass Rails Sortiermethoden in ActiveRecord integriert hat, aber ich schreibe gerade ein einfaches altes Ruby-Skript und würde gerne die Datensätze von einem Array nach Datum sortieren.Wie sort_by Datum in Ruby (nicht Rails)?

Das Datum wird in einer der Zellen des mehrdimensionalen Arrays gespeichert.

Was ist der beste Weg für mich, dies zu nähern, damit ich zu dem Punkt komme, wo ich gerade sort_by_date tun und ich entweder ASC oder DESC angeben?

Ich muss nicht die Methode sort_by_date verwenden, aber die Idee ist, ich würde gerne in der Lage sein, eine Methode auf die Sammlung einfach aufrufen und die Ergebnisse, die ich will.

Gedanken?

+1

Ruby-Arrays haben Sortiermethoden. Lesen Sie die Dokumentation und versuchen Sie etwas. –

+0

versuchen Sie etwas und veröffentlichen Sie, was Sie haben, vorzugsweise einige Code, der unabhängig ausgeführt werden kann, mit anderen Worten, zeigen Sie uns den Code – peter

+1

Ich würde davon ausgehen, Sie wollen etwas wie: arr.sort_by {| x | x.date} – texasbruce

Antwort

10

So ähnlich?

class Array 
    def sort_by_date(direction="ASC") 
     if direction == "ASC" 
     self.sort 
     elsif direction == "DESC" 
     self.sort {|a,b| b <=> a} 
     else 
     raise "Invalid direction. Specify either ASC or DESC."  
     end 
    end 
    end 

Ein mehrdimensionales Array ist nur ein Array von Arrays, so rufen Sie diese Methode auf der ‚Dimension‘ Sie sortieren möchten.

+0

Danke! Das funktioniert. – marcamillion

12
def sort_by_date(dates, direction="ASC") 
    sorted = dates.sort 
    sorted.reverse! if direction == "DESC" 
    sorted 
end 
+0

Dies ist eine faszinierende Lösung ... Danke! – marcamillion

+0

<3 Dies ist Weg sauberer – shime

2

Folgendes funktioniert möglicherweise nicht für Date-Objekt, sollte aber für DateTime-Objekte funktionieren. Dies liegt daran, dass DateTime-Objekte in eine Ganzzahl konvertiert werden können.

Ich musste vor kurzem eine absteigende Sortierung für DateTime-Objekte durchführen, und das ist, was ich gefunden habe.

def sort_by_datetime(dates, direction="ASC") 
    dates.sort_by { |date| direction == "DESC" ? -date.to_i : date } 
end 
2

So wie ich es jetzt tue, es ist:

@collection.sort! { |a,b| DateTime.parse(a['date']) <=> DateTime.parse(b['date']) } 

Und mit dem! operator Ich betrachte dieselbe Variable (ansonsten brauche ich eine andere, um die modifizierte Variable zu halten). Bis jetzt funktioniert es als ein Charme.

+1

elegante Lösung – iGallina

+1

Verwendung von '# sort_by' konvertiert implizit die Werte basierend auf dem Block. Es wird also mehr Speicher benötigen, aber es wird auch nicht jeden Vergleich analysieren. – kjprice