配列から空白の要素を削除するにはどうすればよいですか?


284

次の配列があります

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

配列から空白の要素を削除し、次の結果が欲しい:

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

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

回答:


501

これには多くの方法があります。1つは reject

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

を使用してreject!、そのcities場で変更することもできます。それはどちらかが返されますcities、それは何かを拒否した場合、またはその戻り値としてnil何も拒否が行われていない場合。あなたが注意していなければ、それは問題になるかもしれません(コメントでこれを指摘してくれたninja08に感謝します)。


227
または、よりコンパクトな方がよい場合cities.reject!(&:empty?)
aNoble、

53
えっと、どうしてcities.reject!(&:blank?)empty?アレイ用
Nico

27
@Nico blank?はからのみ利用できますActiveSupport。標準Rubyでは使用しますString#empty?ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
Michael Kohl

24
rejectリターン、リターンのreject!理由よりも優れています[].reject!(&:empty?)nil[].reject(&:empty?)[]
コンヤック

17
拒否に注意してください!。拒否!配列に変更が加えられていない場合は、nilを返します。変更が行われていないときに配列を返したい場合は、強打せずにrejectを使用します。
Nick Res 2015

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

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

5
nil値も回避するために.reject(&:blank?)を使用したいと思います
ran632

4
@RanGalili blank?は良い選択ですが、そのrails方法であり、この質問はプレーンに関するものですruby
スワップ

83

ここに私のために働くものがあります:

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

出力:

[1, 2, "hello"]

Ruby 2.3.1でNoMethodError: "undefined method` blank? ' 1:Fixnum」の場合、これを実行しようとします。
トム

1
@トムブランク?Rails固有のメソッドです。単純なルビのための配列には存在しません。空を使用する必要がありますか?または独自のメソッドを記述します。
jpgeek

@jpgeek明確化してくれてありがとう、それは私が:blank?Rails特有のものだと気づくのに苦労したことだった。
トム・

なぜならNoMethodError: undefined method empty? for nil:NilClass:blank? より優れているからです:empty?
Lane

:blankよりもうまく機能します:empty。そのため:emptyには使用できませんnil
KBIIX

54

私のプロジェクトでは私が使用しますdelete

cities.delete("")

5
エレガント!残念ながら、残りの配列は返されませんが、かなり滑らかです
Kevin

11
Array.deleteは直感に反しています。このようなメソッドが存在する場合、.delete!()のように動作します。.delete()は、破壊的な方法で配列を直接操作します。
scarver2 2013

41

このような配列を整理したいときは、次のようにします。

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

これにより、すべての空白またはnil要素が削除されます。


1
実際には、Object#blankに一致するものもすべて削除されるため、The Tin Manの回答の方が優れています。つまりnil、 ""、 "\ n"、 ""、 "\ n \ r"など。受け入れられた回答とは異なり、Railsがなくても機能します。
スーパールミナリー2013

24

最も明示的

cities.delete_if(&:blank?)

これにより、nil値と空の文字列("")値の両方が削除されます。

例えば:

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

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

句読点を削除してコロンを追加すると、「Cities:delete if blank」:D
clapp

2
空白はルビーまたはレールのメソッドですか?
Arnold Roa 2015

2
@ArnoldRoa Railsメソッドです。
PaulMest 2016

1
空の文字列の間にスペースがある場合はどうなりますか?
Steven Aguilar 2017

@StevenAguilarスペースは長さ1と見なされます(スペースは文字であるため)。""。空白?=> false
phlegx

23

これを試して:

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

4
これは洗練されていて、「」を返しません。これは素晴らしいリルトリックです。
Sean Larkin 2013年

2
["カトマンズ"、 "ポカラ"、 ""、 "ダラーン"、 "ブトワル"]-[""]-この場合は機能しません
ajahongir '29 / 10/29

2.0.0-p247:001> ["カトマンズ"、 "ポカラ"、 ""、 "ダラ"、 "ブトワル"]-[""] => ["カトマンズ"、 "ポカラ"、 "ダラ"、 "ブトワル" "]私のために働くようです。なぜ動かないと思いますか?
Raels、2014年

1
@Raels、この場合の空の文字列は空ではありません。スペースが1つあります。
Chandranshu 2014年

1
@Chandranshu違うと懇願する。テキストをコピーしてエディターに貼り付けたところ、提案したように引用符の間にスペースがないことがわかりました。存在する場合は、[""、 ""]を減算すると機能します。超光輝の例は似ており、同様に動作します。元のリクエストは、「空白の要素」ではなく「空白の要素」を削除することでしたが、サンプルの空白要素はOPで「」と表示されていました。
Raels、2014年

17

使用reject

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

13
または、aNobleは、上記のように、reject(&:empty?)
muが短すぎる

procへのシンボルは、ブロック形式よりも1.8.7で遅くなります。それは私が1.9.2で見たものと同等です
Caley Woods

これは、Object#empty?に一致するすべての要素を削除するため、優れています。「\ n」、「」、nil、「\ n \ n \ n」など...
2013年

5
nil.empty?ブームブレイク!
2014年

1
あなたの配列がnilの要素を持っている場合@AllenMaxwell @Naveed、先行しreject(&:empty?)compact例えば[nil, ''].compact.reject(&:empty?)
scarver2

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

blank?over を使用する理由empty?は、空白がnil、空の文字列、および空白を認識するためです。例えば:

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

まだ戻ります:

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

そして、呼び出したempty?上で" "意志のリターンfalseあなたはおそらくになりたいです、true

注:blank?Railsからのみアクセスできます。Rubyはのみをサポートしていますempty?


11

すでに多くの答えがありますが、Railsの世界にいる場合の別のアプローチを次に示します。

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

4
present?から来ていActiveSupportます。これにはRailsタグがなく、1つのメソッドに追加のgemを必要とすることは過度に思われます。
Michael Kohl 2012

1
@Naveedの場合は、「RoRを使用している場合」で始める必要があります。それはまだ初心者にとって有用な情報なので、私はそれを反対投票しません。
pixelearth 2013

9

これを達成するためのもう1つのアプローチを次に示します。

我々は使用することができpresenceselect

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

cities.select(&:presence)

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

2
これありがとう。" "配列に、rejectメソッドで削除されなかった要素がいくつかありました。削除されたメソッドnil ""または" "アイテム。
iamse7en 2015年

8

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

[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]


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

削除と配置はコストのかかる操作になる
2012


0

別の方法:

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

-2

join&で厳格に更新するsplit

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

結果は次のようになります。

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

注意:これはスペースのある都市では機能しません


2
非常に危険に見えます!
msdundar 2017年

1
「ニューヨーク」や「ナウジョウジアクメネ」のような都市がある場合、これは間違いなく失敗します:)
ペトラスL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.