bidimensionales arreglos array arrays ruby sorting

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