J'ai un tableau d'objets dans Ruby on Rails. Je veux trier le tableau par un attribut de l'objet. C'est possible?Trier un tableau d'objets dans Ruby par l'attribut d'objet?
Répondre
Oui il est possible
http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/
Oui, en utilisant ce Array#sort!
est facile.
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Tableau # type fonctionne bien, comme affiché ci-dessus:
myarray.sort! { |a, b| a.attribute <=> b.attribute }
Mais, vous devez vous assurer que l'opérateur <=>
est mis en œuvre pour cet attribut. Si c'est un type de données natif Ruby, ce n'est pas un problème. Sinon, écrivez votre propre implémentation qui renvoie -1 si < b, 0 si elles sont égales, et 1 si a> b.
Je recommande d'utiliser à la place sort_by:
objects.sort_by {|obj| obj.attribute}
Surtout si l'attribut peut être calculé.
Ou la version abrégée: 'objects.sort_by (&: attribute)' – Nikola
Encore plus court objects.sort_by &: attribut –
Si vous rencontrez des problèmes avec les majuscules et les minuscules triées séparément, vous pouvez utiliser 'objects.sort_by {| obj | obj.attribute.downcase} ' – campeterson
dans le cas où vous avez besoin de tri par deux attributs, où le premier est plus important que la deuxième (des moyens de prise en compte deuxième arguments que si les premiers arguments sont égaux), alors vous pouvez le faire comme ça
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
ou en cas de tableau de tableaux
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
Hmmm MERCI! – MrYoshiji
Vous pouvez faire une classe sortable en remplaçant la méthode < =>:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(per)
@last_name + @first_name <=> per.last_name + per.first_name
end
end
Maintenant, un tableau d'objets Person sera triable sur last_name.
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
@model_name.sort! { |a,b| a.attribute <=> b.attribute }
Il y a beaucoup de réponses identiques publiées en 2009. Pas besoin d'en ajouter une autre. – interjay
N'utilisez pas '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, utilisez 'sort_by'. Ce sera beaucoup plus rapide. –
ordre croissant:
objects_array.sort! { |a, b| a.attribute <=> b.attribute }
ou
objects_array.sort_by{ |obj| obj.attribute }
ordre décroissant:
objects_array.sort! { |a, b| b.attribute <=> a.attribute }
ou
objects_array.sort_by{ |obj| obj.attribute }.reverse
Plus élégant objects.sort_by(&:attribute)
, vous pouvez ajouter un oon .reverse
si vous avez besoin de changer l'ordre.
- 1. Trier un tableau multidimensionnel
- 2. Trier les objets par des valeurs booléennes dans Ruby
- 3. Trier et valeurs magasin de tableau multidimensionnel dans le nouveau tableau dans Ruby
- 4. Mettez la chaîne dans un tableau multidimensionnel et trier puis par sous-valeur dans le tableau
- 5. Comment trier un tableau dans Scala?
- 6. PHP: Trier un tableau par la longueur de ses valeurs?
- 7. Comment générer un tableau de distances par paires dans Ruby?
- 8. Comment trier un tableau de chaînes?
- 9. glob() - trier par date
- 10. Comment trier un tableau de FileInfo []
- 11. Comment trier un NSArray par ordre alphabétique?
- 12. Comment découper un tableau dans Ruby
- 13. Meilleure façon de trier un tableau
- 14. Trier le tableau par nombre de mots-clés trouvés
- 15. PHP: trier le tableau par intervalles d'une demi-heure
- 16. Comment convertir un tableau ruby en tableau C avec RubyInline?
- 17. Comment trier un tableau de cette façon en php
- 18. Comment fusionner des sous-tableaux dans un tableau dans Ruby?
- 19. Unix Trier par U
- 20. Comment faire un tableau multidimensionnel dynamique en ruby?
- 21. Classement par étoiles jQuery dans un tableau
- 22. Rechercher hachage dans un tableau par valeur
- 23. Comment trier gridview par colonne contenant un nombre entier nul?
- 24. Comment trier javascript object array par element.name
- 25. Comment trier les enregistrements par page
- 26. Trier NSArray par NSDate, aujourd'hui
- 27. Comment obtenir un tableau de noms de tables dans ruby
- 28. Conversion d'un tableau de clés et un tableau de valeurs dans un hachage en Ruby
- 29. Convertir un tableau d'entiers en un tableau de chaînes dans Ruby?
- 30. trier les images par LastTimeWrite
Thnx mon pote mais ça n'a pas marché pour moi J'ai un tableau d'objets. Dans lequel l'un des attributs de l'objet est created_at. Je veux trier avec ce champ. donc j'ai fait @ comm_bytes.sort! {| a, b | a.created_at <=> b.created_at} mais pas de chance pour moi pouvez-vous aider .... ?? –
Y a-t-il une méthode created_at pour accéder à l'attribut @created_at? Quel genre d'objet est @created_at? Définit-il '<=>'? Quel genre d'erreurs obtenez-vous? etc, etc, ad nausée. En d'autres termes, nous avons besoin de plus de détails que "mais pas de chance pour moi". – rampion
cela fonctionne si vous faites myarray = myarray.sort {...} sans "!" – DoruChidean