web-dev-qa-db-fra.com

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

La syntaxe de mappage:

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 que diriez-vous 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 sur ce tableau ou sélectionner uniquement celles qui ont une valeur.

J'ai essayé:

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

Retourne juste beaucoup de faux et quand j'utilise la même chose, changez simplement de carte pour sélectionner je reçois:

[]
97
ingalcala

Il semble que details soit un tableau de hachages. Donc, item à l'intérieur de votre bloc sera le hash complet. Par conséquent, pour vérifier la touche :qty, procédez comme suit:

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

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

documentation officielle choisie

117
Emily

EDIT: Je viens de réaliser que vous voulez 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 la clé et la valeur sont données au bloc 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 vérifiée):

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

Notez qu'il s'agit de Ruby 1.9. Si vous devez maintenir la compatibilité avec 1.8, vous pouvez faire:

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

Lorsque vous traitez avec un hachage {}, utilisez à la fois la clé et la valeur du bloc à l'intérieur de ||.

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

=>[false, false, true, false, false]
9
Michael Berkowski