Mam tablicę obiektów w Ruby on Rails. Chcę posortować tablicę według atrybutu obiektu. Czy to możliwe?
128
Zamiast tego polecam użycie sort_by:
objects.sort_by {|obj| obj.attribute}
Zwłaszcza jeśli atrybut można obliczyć.
Lub bardziej zwięzłe podejście:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(np. Prędkość itp.)?Tak, korzystanie z
Array#sort!
tego jest łatwe.źródło
<=>
? Jakie błędy otrzymujesz? etc, etc, ad nauseum. Innymi słowy, potrzebujemy więcej szczegółów niż „ale nie mam szczęścia”.sort
jeśli chcesz zachować oryginał i przypisać wynik do innego obiektu; w przeciwnym razie, należy użyć wariantu w miejscu,sort!
. W rzeczywistościsort
wywołujesort!
wewnętrznie po skopiowaniu oryginalnego obiektu.sort!
będzie działać dobrze i zawsze (!) Rób to samo, co napisałeś.Rosnąco :
lub
Kolejność malejąca :
lub
źródło
w przypadku, gdy potrzebujesz sortowania według dwóch atrybutów, gdzie pierwszy jest ważniejszy niż drugi (oznacza wzięcie pod uwagę drugich argumentów tylko wtedy, gdy pierwsze argumenty są równe), możesz to zrobić
lub w przypadku tablicy tablic
źródło
Możesz ustawić dowolną klasę jako sortowalną, zastępując metodę <=>:
Teraz tablica obiektów Person będzie możliwa do sortowania według last_name.
źródło
Array # sort działa dobrze, jak napisano powyżej:
ALE musisz się upewnić, że
<=>
operator jest zaimplementowany dla tego atrybutu. Jeśli jest to natywny typ danych Ruby, nie stanowi to problemu. W przeciwnym razie napisz własną implementację, która zwraca -1, jeśli a <b, 0, jeśli są równe i 1, jeśli a> b.źródło
Bardziej elegancki
objects.sort_by(&:attribute)
, możesz dodać,.reverse
jeśli chcesz zmienić kolejność.źródło
Tak, to możliwe
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
źródło
źródło
sort
gdy sortujesz obiekty, których nie można bezpośrednio porównać. Jeśli musisz uzyskać dostęp do atrybutów lub wykonać obliczenia, aby uzyskać wartość do porównania, użyjsort_by
. Będzie dużo szybciej.