web-dev-qa-db-ja.com

配列から空白の要素を削除する方法

私は以下の配列を持っています

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

配列から空白の要素を削除したいので、次のようにします。

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

compactのような、ループなしでそれを実行する方法はありますか?

259
ashisrai_

これを行うには多くの方法がありますが、その1つがrejectです。

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

reject!を使うこともできます。これはcitiesを代わりに修正します。何かを拒否した場合は戻り値としてcitiesを、拒否しなかった場合はnilを返します。注意していないのであれば、これは問題になる可能性があります(コメントでこれを指摘してくれたninja08に感謝します)。

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

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

これは私のために働くものです:

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

出力:

[1, 2, "hello"]
65
kimerseen

私のプロジェクトではdeleteを使います。

cities.delete("")
52
esio

このように配列を整理したい場合は、次のようにします。

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

これはすべての空白またはnil要素を削除します。

40
superluminary

最も明白な

cities.delete_if(&:blank?)

これはnil値と空の文字列("")値の両方を削除します。

例えば:

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

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

これを試して:

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

rejectを使用してください。

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

blank?の代わりにempty?を使用したいのは、空白がnil、空文字列、空白を認識するからです。例えば:

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

それでも戻ります:

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

empty?" "を呼び出すとfalseが返されます。おそらくこれはtrueになります。

注意:blank?はRailsを通してのみアクセス可能です。Rubyはempty?のみをサポートします。

14
Colton Fent

すでにたくさんの答えがありますが、Railsの世界にいるのであれば、これが別のアプローチです。

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

これを達成するためのもう1つのアプローチがあります。

presenceselectと一緒に使用できます

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

cities.select(&:presence)

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

配列に複数の型が混在している場合の解決策は次のとおりです。

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

溶液:

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

出力:

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

あなたはこれを試すことができます

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

最短の方法cities.select(&:present?)

1
Javier Segovia

別の方法:

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