J'ai un tableau d'objets dans Ruby on Rails. Je veux trier le tableau par un attribut de l'objet. C'est possible?
129
Je recommande d'utiliser sort_by à la place:
objects.sort_by {|obj| obj.attribute}
Surtout si l'attribut peut être calculé.
Ou une approche plus concise:
objects.sort_by(&:attribute)
objects.sort_by(&:attribute)
objects.sort_by { |obj| obj.attribute.downcase }
sort!
(par exemple, la vitesse, etc.)?Oui,
Array#sort!
il est facile de l'utiliser.la source
<=>
? Quel genre d'erreurs obtenez-vous? etc, etc, ad nauseum. En d'autres termes, nous avons besoin de plus de détails que "mais pas de chance pour moi".sort
si vous souhaitez conserver l'original et affecter le résultat à un objet différent; sinon, utilisez la variante en place,sort!
. En fait,sort
appelle ensort!
interne, après avoir copié l'objet d'origine.sort!
cela fonctionnera très bien, et toujours (!) Faire la même chose que ce que vous avez écrit.Ordre croissant :
ou
Ordre décroissant :
ou
la source
au cas où vous auriez besoin de trier par deux attributs, où le premier est plus important que le second (signifie ne prendre en compte les seconds arguments que si les premiers arguments sont égaux), alors vous pouvez faire comme ceci
ou en cas de tableau de tableaux
la source
Vous pouvez rendre n'importe quelle classe triable en remplaçant la méthode <=>:
Désormais, un tableau d'objets Person pourra être trié sur last_name.
la source
Le tri de tableau fonctionne bien, comme indiqué ci-dessus:
MAIS, vous devez vous assurer que l'
<=>
opérateur est implémenté pour cet attribut. S'il s'agit d'un type de données natif Ruby, ce n'est pas un problème. Sinon, écrivez votre propre implémentation qui renvoie -1 si a <b, 0 si elles sont égales et 1 si a> b.la source
Plus élégant
objects.sort_by(&:attribute)
, vous pouvez en ajouter un.reverse
si vous avez besoin de changer de commande.la source
Oui c'est possible
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
la source
la source
sort
lorsque vous triez des objets qui ne peuvent pas être directement comparés. Si vous devez accéder à des attributs ou faire un calcul pour obtenir la valeur à comparer, utilisezsort_by
. Ce sera beaucoup plus rapide.