it-swarm.com.de

Wie entferne ich leere Elemente aus einem Array?

Ich habe das folgende Array 

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]

Ich möchte leere Elemente aus dem Array entfernen und folgendes Ergebnis erhalten:

cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Gibt es eine Methode wie compact, die dies ohne Schleifen macht? 

248
a5his

Es gibt viele Möglichkeiten dies zu tun, eine davon ist reject

noEmptyCities = cities.reject { |c| c.empty? }

Sie können auch reject! verwenden, wodurch cities an Ort und Stelle geändert wird. Es gibt entweder cities als Rückgabewert zurück, wenn etwas abgelehnt wurde, oder nil, wenn keine Ablehnung erfolgt. Das kann ein Problem sein, wenn Sie nicht aufpassen (Dank an Ninja08, dass Sie darauf in den Kommentaren hingewiesen haben).

454
Matt Greer
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)

=> ["A", "B", "C"]
152
user2010324

Folgendes funktioniert für mich:

[1, "", 2, "hello", nil].reject(&:blank?)

ausgabe: 

[1, 2, "hello"]
60
kimerseen

In meinem Projekt verwende ich delete:

cities.delete("")
52
esio

Wenn ich ein Array wie dieses aufräumen möchte, verwende ich:

["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]

Dadurch werden alle leeren oder keine Elemente entfernt.

39
superluminary

Versuche dies:

puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
21
Raels

Am meisten explizit

cities.delete_if(&:blank?)

Dadurch werden sowohl nil-Werte als auch leere Zeichenfolgenwerte ("") entfernt.

Zum Beispiel:

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]

cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
21
phlegx

Verwenden Sie reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
17
the Tin Man
cities.reject! { |c| c.blank? }

Der Grund, aus dem Sie blank? über empty? verwenden möchten, besteht darin, dass blank null, leere Zeichenfolgen und Leerzeichen erkennt. Zum Beispiel:

cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }

würde immer noch zurückkehren:

["Kathmandu", "Pokhara", "Dharan", "Butwal"]

Wenn Sie empty? für " " aufrufen, wird false zurückgegeben, die Sie wahrscheinlich true verwenden möchten.

Hinweis: blank? ist nur über Rails zugänglich, Ruby unterstützt nur empty?.

14
Colton Fent

Es gibt bereits viele Antworten, aber in der Rails-Welt gibt es einen anderen Ansatz:

 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
10
Naveed

Hier ist ein weiterer Ansatz, um dies zu erreichen

wir können presence mit select verwenden

cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]

cities.select(&:presence)

["Kathmandu", "Pokhara", "Dharan", "Butwal"]
9
Sampat Badhe

Hier ist eine Lösung, wenn Sie gemischte Typen in Ihrem Array haben:

[nil,"some string here","",4,3,2]

Lösung:

[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}

Ausgabe:

=> ["some string here", 4, 3, 2]
8
Francois

Sie können dies versuchen

 cities.reject!(&:empty?)
4
anusha
 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 
2
suren

Kürzester Weg cities.select(&:present?)

1
Javier Segovia

eine andere Methode:

> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
0
p4ndepravity