arrays - arreglos - Cómo ordenar una matriz de hash en ruby
array ruby (6)
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?
Si quieres paginar datos en una matriz, deberías requerir ''will_paginate / array'' en tu controlador
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 }
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!{}
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
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
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}