我正在尝试使用每个文件夹中包含的文件构建一个文件夹数组。因此,如果您的目录结构是:
DirA
|- FileA
\- FileB
DirB
\- FileC
我得到了这个数组:
files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"]
我正在尝试构建像这样的哈希
{DirA => [FileA, FileB], DirB => [FileC]}
现在我正在按照我认为相当非Ruby的方式(假设String有一个定义的方法来获取父目录):
h = {}
files.each do |f|
parent = f.getParentDir
if not h[parent] then h[parent] = [] end
h[parent].push f
end
有更优雅的方式吗?
答案 0 :(得分:0)
我愿意
h = {}
files.each do |f|
(h[f.getParentDir] ||= []) << f
end
答案 1 :(得分:0)
这样可以解决问题:
result = files.group_by { |i| i.split("/").first }
result.each_key { |k| result[k] = result[k].map { |f| f.split("/").last } }
如果您的简洁,可以用
替换第二行result.merge!(result) { |k, v| v.map { |f| f.split("/").last } }
答案 2 :(得分:0)
我认为你需要这个哈希(带数组)
{DirA => [FileA, FileB], DirB => [FileC]}
files.each_with_object(Hash.new{|h,k|h[k]=[]}) do |m,res|
k,v = m.split('/')
res[k] << v
end
答案 3 :(得分:0)
files = ["DirA/FileA", "DirA/FileB", "DirB/FileC"]
files.each_with_object(Hash.new { |h,k| h[k] = [] }) do |path, hash|
parent, file = path.split('/', 2)
hash[parent] << file
end
#=> {"DirA"=>["FileA", "FileB"], "DirB"=>["FileC"]}