繁体   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