126 votes

Tableaux Ruby : select(), collect() et map()

La syntaxe de la cartographie :

a = ["a", "b", "c", "d"]      #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}     #=> [true, false, false, false] 
a.select {|item|"a" == item}  #=> ["a"]

Question : Et si j'ai :

 irb(main):105:0> details[1]
 => {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
 :qty2=>"1", :price=>"5,204.34 P"}

Je veux supprimer toutes les entrées qui ont une valeur de quantité vide dans ce tableau ou sélectionner seulement celles qui ont une certaine valeur.

J'ai essayé :

details.map {|item|"" == item}

Il renvoie beaucoup de faux et quand j'utilise la même chose, je change juste la carte pour sélectionner :

[]

157voto

Emily Points 9231

On dirait que details est un tableau de hachages. Ainsi, item à l'intérieur de votre bloc sera le hachage complet. Par conséquent, pour vérifier le :qty vous feriez quelque chose comme ce qui suit :

details.select{ |item| item[:qty] != "" }

Cela vous donnera tous les éléments où le :qty n'est pas une chaîne vide.

documentation officielle de l'événement

30voto

Niklas B. Points 40619

EDITAR: Je viens de réaliser que tu veux filtrer details qui est un tableau de hachages. Dans ce cas, vous pourriez faire

details.reject { |item| item[:qty].empty? }

La structure de données interne elle-même n'est pas un tableau, mais un hachage. Vous pouvez également utiliser select ici, mais le bloc reçoit la clé et la valeur dans ce cas :

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"}
irb(main):002:0> h.select { |key, value| !value.empty? }
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"}

Ou en utilisant reject qui est l'inverse de select (exclut tous les éléments pour lesquels la condition donnée est valable) :

h.reject { |key, value| value.empty? }

Notez que c'est Ruby 1.9. Si vous devez maintenir la compatibilité avec la version 1.8, vous pouvez le faire :

Hash[h.reject { |key, value| value.empty? }]

9voto

Michael Berkowski Points 137903

Lorsqu'il s'agit d'un hachage {} utilise à la fois la clé et la valeur du bloc à l'intérieur de l'objet || .

details.map {|key,item|"" == item}

=>[false, false, true, false, false]

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