Tengo una gran variedad de objetos en Ruby on Rails. Quiero ordenar la matriz por un atributo del objeto. ¿Es posible?
128
Recomiendo usar sort_by en su lugar:
objects.sort_by {|obj| obj.attribute}
Especialmente si se puede calcular el atributo.
O un enfoque más conciso:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(por ejemplo, velocidad, etc.)?Sí, usar
Array#sort!
esto es fácil.fuente
<=>
? ¿Qué tipo de errores tienes? etc, etc, ad nauseum. En otras palabras, necesitamos más detalles que "pero no suerte para mí".sort
si desea conservar el original y asignar el resultado a un objeto diferente; de otro modo, utilizar la variante en el lugar,sort!
. De hecho,sort
llamasort!
internamente, después de copiar el objeto original.sort!
funcionará bien y siempre (!) Hacer lo mismo que ha escrito.Orden ascendente:
o
Orden descendiente :
o
fuente
en caso de que necesite ordenar por dos atributos, donde el primero es más importante que el segundo (significa tener en cuenta los segundos argumentos solo si los primeros argumentos son iguales), entonces puede hacer esto
o en caso de una matriz de matrices
fuente
Puede hacer que cualquier clase se pueda ordenar reemplazando el método <=>:
Ahora se podrá ordenar una matriz de objetos Persona en last_name.
fuente
Array # sort funciona bien, como se publicó anteriormente:
PERO, debe asegurarse de que el
<=>
operador esté implementado para ese atributo. Si es un tipo de datos nativo de Ruby, esto no es un problema. De lo contrario, escriba su propia implementación que devuelva -1 si a <b, 0 si son iguales y 1 si a> b.fuente
Más elegante
objects.sort_by(&:attribute)
, puede agregar un.reverse
si necesita cambiar el orden.fuente
Si es posible
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
fuente
fuente
sort
cuando esté clasificando objetos que no se pueden comparar directamente. Si tiene que acceder a los atributos o hacer un cálculo para obtener el valor para comparar el usosort_by
. Será mucho más rápido