91 votes

Ruby trier par plusieurs valeurs?

J'ai un tableau de hachages:

 a=[{ 'foo'=>0,'bar'=>1 },
   { 'foo'=>0,'bar'=>2 },
   ... ]
 

Je veux trier le tableau d’abord en fonction du foo de chaque hachage, puis en fonction du «bar». Google me dit que c'est comme ça:

 a.sort_by {|h| [ h['foo'],h['bar'] ]}
 

Mais cela me donne ArgumentError "la comparaison de Array avec Array a échoué". Qu'est-ce que ça veut dire?

93voto

dj2 Points 3998
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }

31voto

Will Madden Points 93

Cela signifie probablement qu'il vous manque l'un des champs "foo" ou "bar" dans l'un de vos objets.

La comparaison revient à quelque chose comme nil <=> 2 , qui renvoie nil (au lieu de -1 , 0 ou 1 ) et #sort_by ne sait pas comment gérer nil .

Essaye ça:

a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}

16voto

Phrogz Points 112337

Ce que vous avez posté fonctionne dans Ruby 1.8.7:

 ruby-1.8.7-p302 > a = [{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2}]
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['foo'],h['bar']] }
 => [{"foo"=>0, "bar"=>2}, {"foo"=>99, "bar"=>1}] 

ruby-1.8.7-p302 > a.sort_by{ |h| [h['bar'],h['foo']] }
 => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] 
 

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