145 votes

Trier un tableau d'objets en Ruby par attribut d'objet ?

J'ai un tableau d'objets en Ruby on Rails. Je veux trier le tableau par un attribut de l'objet. Est-ce possible ?

252voto

Scott Points 2453

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)

36voto

Konrad Rudolph Points 231505

Oui, en utilisant Array#sort! C'est facile.

myarray.sort! { |a, b|  a.attribute <=> b.attribute }

32voto

shiva kumar Points 10174

Ordre ascendant :

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

20voto

bumbu Points 442

Si vous avez besoin de trier par deux attributs, où le premier est plus important que le second (ce qui signifie que le second argument n'est pris en compte que si le premier est égal), vous pouvez procéder comme suit

myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }

ou dans le cas d'un tableau de tableaux

myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }

17voto

user1182000 Points 736

Vous pouvez rendre n'importe quelle classe triable en surchargeant 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 <=>(other)
    @last_name + @first_name <=> other.last_name + other.first_name
  end

end

Maintenant, un tableau d'objets Personne sera triable sur le nom de famille.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X