Jak posortować tablicę skrótów w rubinie


147

Mam tablicę, której każdy element jest skrótem z trzema parami klucz / wartość:

:phone => "2130001111", :zip => "12345", :city => "sometown"

Chciałbym posortować dane ziptak, aby wszystkie phoneznaki w tym samym obszarze były razem. Czy Ruby ma na to łatwy sposób? Czy można will_paginatepodzielić dane na strony w tablicy?


Jeśli generujesz tablicę, a nie jest ona dana, rozważ zamiast tego uczynienie jej hashem z elementami (na przykład) [city,zip]=>phonelub city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland

Odpowiedzi:


364

Simples:

array_of_hashes.sort_by { |hsh| hsh[:zip] }

Uwaga:

Podczas używania sort_bymusisz przypisać wynik do nowej zmiennej: w array_of_hashes = array_of_hashes.sort_by{}przeciwnym razie możesz użyć metody "bang", aby zmodyfikować w miejscu:array_of_hashes.sort_by!{}


8
Podczas używania sort_bymusisz przypisać wynik do nowej zmiennej: w array_of_hashes = array_of_hashes.sort_by{}przeciwnym razie możesz użyć metody "bang", aby zmodyfikować w miejscu:array_of_hashes.sort_by!{}
Andrew

11
Jeszcze krócej:array_of_hashes.sort_by(&:zip)
Etienne

24
@Etienne: To jest skrót do, .sort_by { |hsh| hsh.zip }więc będzie działać tylko wtedy, gdy .zipzostanie zdefiniowany jako metoda dla każdego skrótu. Domyślnie skróty nie ujawniają swoich kluczy jako metod, więc myślę, że prawdopodobnie dzieje się tam coś innego.
Gareth

Zwróć uwagę na huk:array_of_hashes.sort_by!(&:zip)
Diego D

@Gareth: W przypadku ActiveRecords .zipi [:zip]oba będą działać. ActiveRecords mają zdefiniowane oba style.
Atul Vaibhav

17
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}

10

Użyj huku, aby zmodyfikować tablicę w miejscu:

array_of_hashes.sort_by!(&:zip)

Lub przypisz go ponownie:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Zwróć uwagę, że metoda sort_by będzie sortować według kolejności rosnącej.

Jeśli chcesz sortować w kolejności malejącej, możesz zrobić coś takiego:

array_of_hashes.sort_by!(&:zip).reverse!

lub

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse

6
Notacja &:jest skrótem do method, nie attribute! Zakładasz, że Hash ma metody odzwierciedlające atrybuty ...
Andre Figueiredo

1
Dzięki za reversemetodę: p
Alain ANDRE

4

Jeśli chcesz paginować dane w tablicy, powinieneś wymagać 'will_paginate / array' w swoim kontrolerze


2

Jeśli masz zagnieżdżony Hash (Hash w formacie hash) jako elementy Array (strukturę podobną do poniższej) i chcesz posortować go według klucza (data tutaj)

data =  [
    {
        "2018-11-13": {
            "avg_score": 4,
            "avg_duration": 29.24
        }
    },
    {
         "2017-03-13": {
            "avg_score": 4,
            "avg_duration": 40.24
        }
    },
    {
         "2018-03-13": {
            "avg_score": 4,
            "avg_duration": 39.24
        }
    }
]

Użyj metody Array „sort_by” jako

data.sort_by { |element| element.keys.first }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.