Come ordinare una serie di hash in ruby


148

Ho un array, ognuno dei cui elementi è un hash con tre coppie chiave / valore:

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

Vorrei ordinare i dati in zipmodo che tutti gli phones nella stessa area siano insieme. Ruby ha un modo semplice per farlo? È possibile will_paginateimpaginare i dati in un array?


Se stai generando l'array, piuttosto che essere un dato, considera invece di renderlo un hash, con elementi (ad esempio) [city,zip]=>phoneo city=>{zip1=>[<phones>], zip2=>...}.
Cary Swoveland,

Risposte:


365

semplici:

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

Nota:

Quando si utilizza sort_byè necessario assegnare il risultato a una nuova variabile: array_of_hashes = array_of_hashes.sort_by{}altrimenti è possibile utilizzare il metodo "bang" per modificare sul posto:array_of_hashes.sort_by!{}


8
Quando si utilizza sort_byè necessario assegnare il risultato a una nuova variabile: array_of_hashes = array_of_hashes.sort_by{}altrimenti è possibile utilizzare il metodo "bang" per modificare sul posto:array_of_hashes.sort_by!{}
Andrew

11
Ancora più breve:array_of_hashes.sort_by(&:zip)
Etienne,

24
@Etienne: questa è una scorciatoia per .sort_by { |hsh| hsh.zip }e quindi funzionerà solo se .zipè definita come un metodo su ogni hash. Per impostazione predefinita, gli hash non espongono le loro chiavi come metodi, quindi immagino che probabilmente ci sia qualcos'altro che sta succedendo lì.
Gareth,

Nota il botto:array_of_hashes.sort_by!(&:zip)
Diego D,

@Gareth: in caso di ActiveRecords, .ziped [:zip]entrambi funzioneranno. ActiveRecords ha entrambi gli stili definiti.
Atul Vaibhav,

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

10

Usa il botto per modificare in posizione l'array:

array_of_hashes.sort_by!(&:zip)

O riassegnalo:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Si noti che il metodo sort_by ordinerà in ordine crescente.

Se devi ordinare in ordine decrescente, puoi fare qualcosa del genere:

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

o

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

6
La notazione &:è una scorciatoia per method, no attribute! Stai presumendo che l'hash abbia metodi che riflettano gli attributi ..
Andre Figueiredo,

1
Grazie per il reversemetodo: p
Alain ANDRE,

4

Se si desidera impaginare i dati nell'array, è necessario richiedere "will_paginate / array" nel controller


2

Se hai l' hash nidificato (hash all'interno di un formato hash) come elementi dell'array (una struttura come la seguente) e desideri ordinarlo per chiave (data qui)

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
        }
    }
]

Utilizzare il metodo array 'sort_by' come

data.sort_by { |element| element.keys.first }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.