Die Syntax für das Mapping:
a = ["a", "b", "c", "d"] #=> ["a", "b", "c", "d"]
a.map {|item|"a" == item} #=> [true, false, false, false]
a.select {|item|"a" == item} #=> ["a"]
Frage, wie wäre es, wenn ich habe:
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"}
Ich möchte jeden Eintrag löschen, der einen leeren Mengenwert in diesem Array hat, oder nur diejenigen auswählen, die einen Wert enthalten.
Ich habe es versucht:
details.map {|item|"" == item}
Gibt einfach eine Menge false zurück und wenn ich dieselbe verwende, ändere ich einfach die Karte, um Folgendes auszuwählen:
[]
:qty
es dort nicht einmal erscheint.Antworten:
Es sieht aus wie
details
eine Reihe von Hashes. Alsoitem
innerhalb des Blocks wird die ganze Hash sein. Um den:qty
Schlüssel zu überprüfen , gehen Sie wie folgt vor:Dadurch erhalten Sie alle Elemente, bei denen der
:qty
Schlüssel keine leere Zeichenfolge ist.offizielle ausgewählte Dokumentation
quelle
EDIT: Ich habe gerade festgestellt, dass Sie filtern möchten
details
, was eine Reihe von Hashes ist. In diesem Fall könnten Sie tunDie innere Datenstruktur selbst ist kein Array, sondern ein Hash. Sie können auch
select
hier verwenden, aber der Block erhält in diesem Fall den Schlüssel und den Wert:Oder using
reject
, was umgekehrt istselect
(schließt alle Elemente aus, für die die angegebene Bedingung gilt):Beachten Sie, dass dies Ruby 1.9 ist. Wenn Sie die Kompatibilität mit 1.8 beibehalten müssen, können Sie Folgendes tun:
quelle
details
Array selbst gefiltert werden kann.{}
Verwenden Sie beim Umgang mit einem Hash sowohl den Schlüssel als auch den Wert für den Block innerhalb des||
.quelle