Bir diziden boş öğeleri nasıl kaldırabilirim?


284

Aşağıdaki diziye sahibim

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

Diziden boş öğeleri kaldırmak ve aşağıdaki sonucu istiyorum:

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

compactDöngüler olmadan yapacak böyle bir yöntem var mı ?

Yanıtlar:


501

Bunu yapmanın birçok yolu var, biri reject

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

Ayrıca reject!, citiesyerinde değişiklik yapacak olan kullanabilirsiniz . Bir citiesşey reddedilirse veya nilherhangi bir ret yapılmazsa dönüş değeri olarak geri döner . Dikkatli değilseniz bu bir gotcha olabilir (yorumlarda bunu belirttiği için ninja08'e teşekkürler).


227
Veya daha kompakt cities.reject!(&:empty?)
olmayı

53
hm, neden olmasın cities.reject!(&:blank?)? empty?diziler için
Nico

27
@Nico blank?yalnızca üzerinden kullanılabilir ActiveSupport. Standart Ruby şunları kullanır String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
Michael Kohl

24
rejectdaha iyi olduğu reject!, çünkü [].reject!(&:empty?)döner nil, [].reject(&:empty?)iadeler[]
konyak

17
reddetmek dikkat !. reddetmek! dizide hiçbir değişiklik yapılmazsa nil döndürür. Herhangi bir değişiklik yapılmadığında diziyi döndürmek istiyorsanız, patlama olmadan reddetme işlevini kullanın.
Nick Res

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

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

5
Nil değerlerinden de kaçınmak için .reject (&: blank?) Kullanmayı tercih ederim
12'de ran632

4
@RanGalili blank?iyi bir seçim ama onun bir railsyöntem ve bu soru ova ile ilgiliruby
Takas

83

İşte benim için işe yarayan:

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

çıktı:

[1, 2, "hello"]

Ruby 2.3.1'de NoMethodError: "tanımsız yöntem` `boş? '' for 1: Fixnum "bunu yürütmeye çalışıyor.
Tom

1
@Tom boş mu? Rails'e özgü bir yöntemdir. Düz yakut için Array üzerinde mevcut değildir. Boş mu kullanmanız gerekecek? veya kendi yönteminizi yazın.
jpgeek

@jpgeek Açıklığa kavuştuğunuz için teşekkürler, Rails'e :blank?özgü olduğunu fark etmemdeki sorun buydu .
Tom

Çünkü NoMethodError: undefined method empty? for nil:NilClass, :blank? daha iyi:empty?
Lane

:blankdaha iyi çalışır :empty. Çünkü :emptyçalışmıyornil
KBIIX

54

Projemde deleteşunları kullanıyorum :

cities.delete("")

5
zarif! ne yazık ki kalan diziyi döndürmez, ama oldukça kaygan
Kevin

11
Array.delete karşı sezgiseldir. Böyle bir yöntem mevcutsa .delete! () Gibi çalışır. .Delete () doğrudan dizi üzerinde yıkıcı bir şekilde çalışır.
kırmızı

41

Ben böyle bir dizi derlemek istediğinizde kullanıyorum:

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

Bu, tüm boş veya sıfır öğelerini kaldıracaktır.


1
Aslında, Tin Man'ın cevabı daha iyi çünkü Object # blank ile eşleşen her şeyi kaldıracak mı? yani nil, "", "\ n", "", "\ n \ r", vb. Kabul edilen yanıtın aksine, Rails olmadan da çalışacaktır.
superluminary

24

En Açık

cities.delete_if(&:blank?)

Bu, hem nildeğerleri hem de boş dize ( "") değerlerini kaldıracaktır .

Örneğin:

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

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

Noktalama işaretlerini kaldırma ve iki nokta üst üste ekleme "Şehirler: boşsa sil" değerini verir: D
clapp

2
boş bir yakut veya raylar yöntemidir?
Arnold Roa

2
@ArnoldRoa Bir Rails yöntemidir.
PaulMest

1
boş dize arasında boşluk varsa ne olur?
Steven Aguilar

@StevenAguilar bir boşluk uzunluk 1 olarak kabul edilir (çünkü boşluk bir karakterdir). "". boş? => yanlış
phlegx

23

Bunu dene:

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

4
Bu kaygan ve "" dönmüyor! Bu harika bir numara.
Sean Larkin

2
["Katmandu", "Pokhara", "", "Dharan", "Butwal"] - [""] - bu durumda çalışmaz
ajahongir

2.0.0-p247: 001> ["Katmandu", "Pokhara", "", "Dharan", "Butwal"] - [""] => ["Katmandu", "Pokhara", "Dharan", "Butwal "] Benim için iş gibi görünüyor. Sizce neden işe yaramıyor?
Raels

1
@Raels, bu durumda boş dize boş değildir. İçinde tek bir boşluk var.
Chandranshu

1
@ Handranshu Farklı olmaya yalvarıyorum. Metni bir düzenleyiciye kopyalayıp yapıştırdım ve önerileriniz arasında tırnak işaretleri arasında boşluk olmadığını gördüm. Eğer olsaydı, ["", ""] çıkarılması işe yarardı. superluminary örneği benzerdir ve aynı zamanda işe yarar. Orijinal istek, boşluk olan öğeleri değil "boş öğeleri" kaldırmaktı ve örnek boş öğe OP'de "" olarak gösterildi.
1414

17

Kullanım reject:

>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]

13
Veya yukarıda belirtildiği gibi bir asil reject(&:empty?),.
mu

Proc sembolü, blok biçiminden 1.8.7 daha yavaştır.
1.9.2'de

Bu, Object # empty? İle eşleşen herhangi bir öğeyi kaldıracağı için iyidir, örn. "\ n", "", nil, "\ n \ n \ n", vs ...
superluminary

5
nil.empty?booom molası!
Nefret

1
Diziniz nil unsurları varsa @AllenMaxwell @Naveed, önce reject(&:empty?)birlikte compactörneğin[nil, ''].compact.reject(&:empty?)
scarver2

14
cities.reject! { |c| c.blank? }

Kullanmak istediğiniz sebebi blank?üzerinde empty?o boş nil, boş dizeleri ve beyaz boşluk tanır olduğunu. Örneğin:

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

yine de dönecekti:

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

Ve çağrı yapmak empty?, muhtemelen olmak istediğiniz " "geri dönecektir .falsetrue

Not: blank?yalnızca Rails üzerinden erişilebilir, Ruby yalnızca destekler empty?.


11

Zaten çok fazla cevap var ama burada Rails dünyasındaysanız başka bir yaklaşım var:

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

4
present?geliyor ActiveSupport. Bu bir Rails etiketi vardır ve bir yöntem için ekstra bir mücevher gerektiren aşırı görünüyor.
Michael Kohl

1
@Naveed, bunu "RoR kullanıyorsanız" ile önceden yazmalısınız. Bunu küçümsemem çünkü yeni başlayanlar için hala yararlı bilgiler.
pixelearth

9

İşte bunu başarmak için bir yaklaşım daha

presenceile kullanabilirizselect

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

cities.select(&:presence)

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

2
Bunun için teşekkür ederim. " "Dizimde reddetme yöntemi ile kaldırılmayan bazı öğeler vardı . Yönteminiz kaldırıldı nil ""veya " "öğeler.
iamse7en

8

Dizinizde karışık tipler varsa bir çözüm:

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

Çözüm:

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

Çıktı:

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

5

Bunu deneyebilirsin

 cities.reject!(&:empty?)

3
belki u demekcities.reject!(&:blank?)
xguox

2
 cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? } 

silme ve düzenleme maliyetli bir işlem olacaktır
Naveed


0

diğer yöntem:

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

-2

join& İle katı bir şekilde güncelleyinsplit

cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split

Sonuç:

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

Unutmayın: bu, boşlukları olan bir şehirle çalışmaz


2
Çok riskli görünüyor!
msdundar

1
Eğer "New York" veya "Naujoji Akmene" gibi bir şehir varsa bu kesinlikle başarısız olacaktır :)
Petras L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.