2012-06-23 60 views
0

我有文件路徑分量的一個這樣的數組:構建文件樹

[ ['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> 

謝謝你,我會很感激的任何想法。

回答

1

粗略輪廓;越簡單越好(即,沒有技巧,讓事情變得簡單:)

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這樣的寶石,以減少你必須手動完成的繁忙工作量。

這也不會做任何「理智檢查」,以確保數據不是病態的,例如,您可以構建一個數組,將文件名轉換爲目錄,使用文件名擦除目錄,並且如此 - 爲讀者留下的練習。

+0

謝謝了。這絕對是一個很好的開始。我很感激。 –