这是我的数据结构:
array = [
['foo.rb', 'file', '2432'],
['bar/', 'directory', '2048'],
['bla.yml', 'file', '10'],
['ble.rb', 'file', '2156']
]
现在我希望找到所有.rb文件。
我的过滤器看起来像这样:
filter = '*.rb'
有没有办法在数组变量上正确过滤?
结果应为:
array = [
['foo.rb', 'file', '2432'],
['ble.rb', 'file', '2156']
]
如果它是通过Dir.glob()它会很容易,但这是一个类似数组 数据结构,我有点困惑,我很容易 过滤它。
答案 0 :(得分:1)
array.select{|x| x[0].end_with?(".rb") }
答案 1 :(得分:1)
您可以使用File.fnmatch?
对任何字符串执行shell样式的文件名通配:
files = [ [ 'foo.rb', 'file', '2432' ],
[ 'bar/', 'directory', '2048' ],
[ 'bla.yml', 'file', '10' ],
[ 'ble.rb', 'file', '2156' ]
]
pattern = "*.rb"
files.select do |filename,|
File.fnmatch?(pattern, filename)
end
# => [ [ 'foo.rb', 'file', '2432' ],
# [ 'ble.rb', 'file', '2156' ] ]
请注意do |filename,|
中的逗号。这只是语法糖,它丢弃了除数组的第一个元素以外的所有元素,使得该块等效于:
files.select do |arr|
filename = arr[0]
File.fnmatch?(pattern, filename)
end
答案 2 :(得分:0)
>> array.find_all { |finfo| finfo[0].end_with?(".rb") }
=> [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]
答案 3 :(得分:0)
您还可以使用方法File.extname
。
array = [
['foo.rb', 'file', '2432'],
['bar/', 'directory', '2048'],
['bla.yml', 'file', '10'],
['ble.rb', 'file', '2156']
]
array.select { |a| File.extname(a.first) == '.rb' }
# => [["foo.rb", "file", "2432"], ["ble.rb", "file", "2156"]]