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?

jpw
źródło
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!{}

Gareth
źródło
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]}
Edu
źródło
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
Diego D.
źródło
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

taivn07
źródło
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 }
Abhi
źródło