Come ordinare una matrice di hash in ruby

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

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

Mi piacerebbe ordinare i dati via zip modo che tutti i phone nella stessa area siano insieme. Ruby ha un modo semplice per farlo? Può will_paginate dati di will_paginate in un array?

semplici:

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

Nota:

Quando usi sort_by devi assegnare il risultato a una nuova variabile: array_of_hashes = array_of_hashes.sort_by{} altrimenti puoi usare il metodo “bang” per modificare sul posto: array_of_hashes.sort_by!{}

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

Usa il botto per modificare la matrice:

 array_of_hashes.sort_by!(&:zip) 

Oppure riassegnarlo:

 array_of_hashes = array_of_hashes.sort_by(&:zip) 

Nota che il metodo sort_by ordinerà per 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 

Se si desidera eseguire la paginazione per i dati nell’array, è necessario richiedere “will_paginate / array” nel controller

nil non è paragonabile quindi per evitare di incontrarlo

 sorted = dataarray.sort do |a,b| if a[:zip] == nil -1 # nil gets to the start, swap if you need otherwise elsif b[:zip] == nil 1 else a[:zip] <=> b[:zip] end end 

Se hai Nested Hash (Hash all’interno di un formato hash) come elementi di Array (una struttura come la seguente) e vuoi 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 } } ] 

Usa il metodo ‘sort_by’ di Array come

 data.sort_by { |element| element.keys.first }