2017-11-16 6 views
0

나는 FileList*.js*.tc 개의 확장자가 있습니다. FileList의 두 배열로 분할하는 방법은 하나는 *.js 파일이고 다른 하나는 *.tc 파일입니까? 상사와 그룹 배열 구성원에루비 파일 목록 필터링

답변

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"] } 

을 설치해야 파일을 포함하는 두 배열 (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