41 votes

Comment puis-je regrouper ce tableau de hachages ?

J'ai ce tableau de hachages :

- :name: Ben
  :age: 18
- :name: David
  :age: 19
- :name: Sam
  :age: 18

Je dois les regrouper par age donc ils finissent comme ça :

18:
- :name: Ben
  :age: 18
- :name: Sam
  :age: 18
19:
- :name: David
  :age: 19

J'ai essayé de le faire de cette façon :

array = array.group_by &:age

mais je reçois cette erreur :

NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash):

Qu'est-ce que je fais de mal ? J'utilise Rails 3.0.1 et Ruby 1.9.2.

105voto

KARASZI István Points 15162

El &:age signifie que le group_by doit appeler la méthode age sur les éléments du tableau pour obtenir les données du groupe par. Ce site age n'est pas définie sur les éléments qui sont des Hash dans votre cas.

Cela devrait fonctionner :

array.group_by { |d| d[:age] }

1voto

gunn Points 3050

Comme d'autres l'ont fait remarquer, la méthode de ruby Symbol#to_proc est invoquée et appelle la méthode age sur chaque hachage du tableau. Le problème ici est que les hachages ne répondent pas à une méthode de type age méthode.

Nous pourrions en définir un pour la classe Hash, mais nous n'en avons probablement pas besoin pour chaque instance de hash dans le programme. Au lieu de cela, nous pouvons simplement définir la classe age sur chaque hachage du tableau comme suit :

array.each do |hash|
  class << hash
    def age
      self[:age]
    end
  end
end

Et ensuite nous pouvons utiliser group_by comme vous l'étiez avant :

array = array.group_by &:age

1voto

Michael Johnston Points 2195
out = {}
array_of_hashes.each do |a_hash|
  out[a_hash[:age]] ||= []
  out[a_hash[:age]] << a_hash
end

ou

array.group_by {|item| item[:age]}

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