Cómo ordenar una matriz de hash en ruby

Tengo una matriz, cada uno de cuyos elementos es un hash con tres pares clave / valor:

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

Me gustaría ordenar los datos por zip para que todos los phone en la misma área estén juntos. Ruby tiene una manera fácil de hacer eso? ¿ will_paginate datos de will_paginate en una matriz?

Simples:

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

Nota:

Al usar sort_by necesita asignar el resultado a una nueva variable: array_of_hashes = array_of_hashes.sort_by{} contrario, puede usar el método “bang” para modificar en su lugar: array_of_hashes.sort_by!{}

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

Use la explosión para modificar en su lugar la matriz:

 array_of_hashes.sort_by!(&:zip) 

O reasignarlo:

 array_of_hashes = array_of_hashes.sort_by(&:zip) 

Tenga en cuenta que el método sort_by se ordenará por orden ascendente.

Si necesita ordenar con orden descendente, podría hacer algo como esto:

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

o

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

Si quieres paginar datos en una matriz, deberías requerir ‘will_paginate / array’ en tu controlador

nil no es comparable, así que para evitar cumplirlo

 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 

Si tiene Nested Hash (Hash dentro de un formato hash) como elementos de matriz (una estructura como la siguiente) y desea ordenarla por clave (fecha aquí)

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

Use el método Array ‘sort_by’ como

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