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.