【发布时间】:2017-11-16 03:48:41
【问题描述】:
我有一个带有*.js 和*.tc 扩展名的FileList。如何将其拆分为两个 FileList 数组,一个仅包含 *.js 文件,另一个包含 *.tc 文件?
【问题讨论】:
标签: ruby-on-rails ruby filelist
我有一个带有*.js 和*.tc 扩展名的FileList。如何将其拆分为两个 FileList 数组,一个仅包含 *.js 文件,另一个包含 *.tc 文件?
【问题讨论】:
标签: ruby-on-rails ruby filelist
您可以使用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"] }
现在您有一个 Hash 包含两个数组(result[".js"] 和 result[".tc"]),其中包含根据其扩展名的文件名。
【讨论】:
.group_by(&File.method(:extname)).
values 可以应用于 group_by 的结果。
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(:=~))
【讨论】:
.partition {|f| f =~ /js$/} 对我来说似乎更直接。和end_with?('js') 更具可读性。