我尝试了一些事情,但这周我感觉我的大脑正在度假,我需要完成这件事......所以我希望有人可以帮助我。
我需要根据保存到数据库中的哈希创建一个文件列表。看起来像这样:
['file1', 'dir1/file2', 'dir1/subdir1/file3']
输出应该是这样的:
在html中,最好像这样(用js扩展它以折叠和多选)
<ul>
<li>file1
<li>dir1</li>
<ul>
<li>file2</li>
<li>subdir1</li>
<ul>
<li>file3</li>
</ul>
</ul>
</ul>
我正在使用 Ruby on Rails 并尝试在 RJS 模板中实现此目的。但这并不重要。您还可以帮我提供一些详细的伪代码。
有人知道如何解决这个问题吗?
Edit
感谢大家提供这些解决方案。列表有效,我将其扩展为可折叠解决方案以显示/隐藏目录内容。我仍然有一个问题:该代码的目的是在同步条目后面的复选框中包含完整的文件路径。基于sris的解决方案,我只能读取当前文件及其子文件,但不能读取根目录的整个路径。为了更好地理解:
现在:
[x] dir1
[x] dir2
[x] file1
给我
与文本显示的值相同的复选框,例如 [x] file1 的“file1”。但我需要的是完整路径,例如 [x] file1 的“dir1/dir2/file1”。
有人还有其他提示如何添加这个吗?
这是一个可以为您带来灵感的快速实现。此实现忽略输入数组中文件的顺序。
我已经更新了解决方案以根据您的需要保存整个路径。
dirs = ['file1', 'dir1/file2', 'dir1/subdir1/file3', 'dir1/subdir1/file5']
tree = {}
dirs.each do |path|
current = tree
path.split("/").inject("") do |sub_path,dir|
sub_path = File.join(sub_path, dir)
current[sub_path] ||= {}
current = current[sub_path]
sub_path
end
end
def print_tree(prefix, node)
puts "#{prefix}<ul>"
node.each_pair do |path, subtree|
puts "#{prefix} <li>[#{path[1..-1]}] #{File.basename(path)}</li>"
print_tree(prefix + " ", subtree) unless subtree.empty?
end
puts "#{prefix}</ul>"
end
print_tree "", tree
此代码将生成正确缩进的 HTML,如您的示例。但由于 Ruby (1.8.6) 中的哈希值没有排序,因此无法保证文件的顺序。
产生的输出将如下所示:
<ul>
<li>[dir1] dir1</li>
<ul>
<li>[dir1/subdir1] subdir1</li>
<ul>
<li>[dir1/subdir1/file3] file3</li>
<li>[dir1/subdir1/file5] file5</li>
</ul>
<li>[dir1/file2] file2</li>
</ul>
<li>[file1] file1</li>
</ul>
我希望这可以作为如何获取路径和文件名的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)