私は以下の配列を持っています
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
配列から空白の要素を削除したいので、次のようにします。
cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
compact
のような、ループなしでそれを実行する方法はありますか?
これを行うには多くの方法がありますが、その1つがreject
です。
noEmptyCities = cities.reject { |c| c.empty? }
reject!
を使うこともできます。これはcities
を代わりに修正します。何かを拒否した場合は戻り値としてcities
を、拒否しなかった場合はnil
を返します。注意していないのであれば、これは問題になる可能性があります(コメントでこれを指摘してくれたninja08に感謝します)。
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
これは私のために働くものです:
[1, "", 2, "hello", nil].reject(&:blank?)
出力:
[1, 2, "hello"]
私のプロジェクトではdelete
を使います。
cities.delete("")
このように配列を整理したい場合は、次のようにします。
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
これはすべての空白またはnil要素を削除します。
cities.delete_if(&:blank?)
これはnil
値と空の文字列(""
)値の両方を削除します。
例えば:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
これを試して:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
reject
を使用してください。
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
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?
のみをサポートします。
すでにたくさんの答えがありますが、Railsの世界にいるのであれば、これが別のアプローチです。
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
これを達成するためのもう1つのアプローチがあります。
presence
をselect
と一緒に使用できます
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
配列に複数の型が混在している場合の解決策は次のとおりです。
[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]
あなたはこれを試すことができます
cities.reject!(&:empty?)
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? }
最短の方法cities.select(&:present?)
別の方法:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]