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.