簡體   English   中英

從路徑組件構造文件樹

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM