Tableaux Ruby: sélectionnez (), collecter () et map ()

107

La syntaxe du 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 avec une valeur.

J'ai essayé:

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

Renvoie simplement beaucoup de faux, puis lorsque j'utilise la même carte, changez simplement la carte pour sélectionner J'obtiens:

[]
ingalcala
la source
Si vous regardez de près, il semble que ce soit un tableau de hachages
Emily
@Emily: Très vrai, je viens de m'en rendre compte. Le dernier exemple de code m'a fait penser autrement, car :qtyil n'y apparaît même pas.
Niklas B.

Réponses:

131

Il ressemble à detailsun tableau de hachages. Donc, à l' itemintérieur de votre bloc se trouvera tout le hachage. Par conséquent, pour vérifier la :qtyclé, vous feriez quelque chose comme ceci:

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

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

documentation officielle de sélection

Emilie
la source
26

EDIT: Je viens de réaliser que vous voulez filtrer details, qui est un tableau de hachages. Dans ce cas tu pourrais 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 selectici, 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 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 la version 1.8, vous pouvez faire:

Hash[h.reject { |key, value| value.empty? }]
Niklas B.
la source
@ingalcala: Je viens de réaliser que ma réponse n'est pas vraiment ce dont vous avez besoin. Veuillez vérifier ma modification pour savoir comment filtrer le detailstableau lui-même.
Niklas B.
9

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

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

=>[false, false, true, false, false]
Michael Berkowski
la source