2017-11-16 3 views
0

私はFileList*.js*.tcという拡張子があります。 FileListの2つの配列に分割するにはどうすればよいですか?*.js個のファイルと*.tc個のファイルのみを含むものはどれですか?類似点を持つグループのアレイメンバーにRuby FileListフィルタリング

答えて

3

あなたは、ファイル名の拡張子を取得するためにFile.extnameを使用することができ、かつArray#group_by

result = [ "aaa.js", "bbb.js", "ccc.js", 
      "xxx.tc", "yyy.tc", "zzz.tc" ].group_by { |fname| File.extname(fname) } 

=> { ".js" => ["aaa.js", "bbb.js", "ccc.js"], 
    ".tc" => ["xxx.tc", "yyy.tc", "zzz.tc"] } 

あなたが持っているファイルを含む2つのアレイ(result[".js"]result[".tc"])を含むHash拡張子に応じて名前を付けます。

+1

'.group_by(&File.method(:EXTNAME))'。 – mudasobwa

+0

OPが頼んだもの(実際にはそれが疑わしい)を得るために、 'values'を' group_by'の結果に適用することができます。 – sawa

1

Enumerable#partitionが救助になります。

["aaa.js", "bbb.js", "ccc.js", 
"xxx.tc", "yyy.tc", "zzz.tc" ].partition do |e| 
    e[/(?<=\.).*\z/] == "tc" 
    end 
#⇒ [["xxx.tc", "yyy.tc", "zzz.tc"], 
# ["aaa.js", "bbb.js", "ccc.js"]] 

または、より明確:

["aaa.js", "bbb.js", "ccc.js", 
"xxx.tc", "yyy.tc", "zzz.tc" ].partition(&/\.tc\z/.method(:=~)) 
+0

私たちはここでコメントしています:) '.partition {| f | f =〜/ js $ /} 'はわかりやすいようです。 ?end_with?( 'js') 'が読みやすくなります。 – Felix