Me están enviando un hash anidado que debe ordenarse por sus valores. Por ejemplo:Ordenar elementos en un hash anidado por sus valores
@foo = {"a"=>{"z"=>5, "y"=>3, "x"=>88}, "b"=>{"a"=>2, "d"=>-5}}
Cuando se ejecuta el siguiente:
@foo["a"].sort{|a,b| a[1]<=>b[1]}
me sale:
[["y", 3], ["z", 5], ["x", 88]]
Esto es muy bueno, que es exactamente lo que quiero. El problema es que no siempre sabré cuáles son todas las claves que se me envían, así que necesito algún tipo de ciclo. Traté de hacer lo siguiente:
@foo.each do |e|
e.sort{|a,b| a[1]<=>b[1]}
end
Esto para mí tiene sentido ya que si llamo manualmente @ foo.first [0] consigo
"a"
y @ foo.first [1] devuelve
{"z"=>5, "y"=>3, "x"=>8}
pero por alguna razón esto no está ordenando correctamente (por ejemplo, en absoluto). Supongo que esto se debe a que cada uno llama ordena en todo el objeto hash en lugar de en los valores "a". ¿Cómo accedo a los valores del hash anidado sin saber cuál es su clave?
1) es conceptualmente preferible utilizar Enumerable # sort_by en lugar de ordenar, verifique la respuesta de Phrogz. 2) esto hace que una operación in situ, la creación de nuevos objetos (enfoque funcional) hace que el código sea más fácil de seguir. – tokland
@tokland: todos fueron excelentes puntos, pero mi objetivo era seguir el código OP mientras seguía resolviendo el problema real. Si bien la creación de nuevos objetos puede ser más fácil de seguir, es más claro no crear una variable temporal si se va a asignar de nuevo al original de todos modos. –