[英]construct file tree from path components
我有一个像这样的文件路径组件数组:
[ ['some', 'dir', 'file.txt'],
['other', 'folder', 'here.txt'],
['this', 'one', 'is', 'deeper', 'file.txt'],
['some', 'dir', 'second.txt'
]
因此,该数组包含每个由文件路径组件组成的数组。 内部数组中的最后一个元素始终是文件本身,前面的元素是指向文件的目录。
我要弄清楚的是如何转换以上数据,以便可以使用<ul>
和<li>
标记轻松地用它生成文件树,从而使文件夹彼此嵌套,而同一文件夹中的文件显示在一起。 全部按字母顺序排序。
从上面我想产生以下内容。 文件<li>
本身必须是指向该文件路径的链接:
<ul>
<li>some/
<ul>
<li>dir/
<ul>
<li><a href="some/dir/file.txt">file.txt</a></li>
<li><a href="some/dir/second.txt">second.txt</a></li>
</ul>
</li>
</ul>
</li>
<li>other/
<ul>
<li>folder/
<ul>
<li><a href="other/folder/here.txt">here.txt<a/></li>
</ul>
</li>
</ul>
</li>
<li>this/
<ul>
<li>one/
<ul>
<li>is/
<ul>
<li>deeper/
<ul>
<li><a href="this/one/is/deeper/file.txt">file.txt</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
谢谢,我将不胜感激。
粗略轮廓; 尽可能简单(即没有使事情简单的技巧:)
require 'pp'
dir = {}
files = [
['some', 'dir', 'file.txt'],
['other', 'folder', 'here.txt'],
['this', 'one', 'is', 'deeper', 'file.txt'],
['some', 'dir', 'second.txt']
]
def merge_paths(h, paths)
top = paths[0]
if paths.size == 1
h[top] = top
else
h[top] ||= {}
merge_paths h[top], paths[1..-1]
end
end
files.each do |paths|
merge_paths dir, paths
end
pp dir
输出:
{"some"=>{"dir"=>{"file.txt"=>"file.txt", "second.txt"=>"second.txt"}},
"other"=>{"folder"=>{"here.txt"=>"here.txt"}},
"this"=>{"one"=>{"is"=>{"deeper"=>{"file.txt"=>"file.txt"}}}}}
创建列表基本上是相同的过程。 递归哈希键。 当哈希值不是另一个哈希值时,您处于最后一级。 您可能还想按名称和/或类型排序,例如,首先放置目录(散列的键值),依此类推。
您可以使用多种游戏玩此游戏,包括将其转换成几行代码,并结合使用deep_merge之类的工具,以减少您必须手动进行的繁琐工作。
这也不会做任何“健全性检查”来确保数据不是病理性的,例如,您可以构造一个将文件名转换为目录,使用文件名擦除目录的数组,依此类推-留给读者的练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.