[英]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.