0

我有一个字符串数组,看起来类似于:

“文件夹1/filea/x1.png”、“文件夹1/fileb/x2.png”、“文件夹2/文件夹3/filec/x3.png”......

我的目标是创建一个向下钻取菜单,例如:http: //iwantaneff.in/repo/plugins/menu-nav/drill.down/index.html

在 Rails 中,我尝试过使用 group_by 方法,但没有运气。基本上我需要创建一个文件夹结构,如

  1. 文件夹1
    • 文件
      • x1.png
    • 文件b
      • x2.png
  2. 文件夹2

等等.....

关于从哪里开始的任何想法?我在解决这个问题时遇到了很大的困难。我在每个数组上使用了 split 方法,所以我得到了一个数组数组,但这似乎没有得到任何地方。我想我需要使用递归来遍历子树?

4

1 回答 1

4

答案很简单)使用递归来解析和插入数据

解析示例 =>

   def parse(hash)
      hash.each do |k,v|
        files = v.select{|e| e.size == 1}
        hash[k] = {"files" => files.flatten} unless files.empty?
        dirs = v - files
        unless dirs.empty? 
          dirs = parse(dirs.group_by{|e| e.shift})
          if files.empty?
            hash[k] = dirs  
          else
            hash[k].merge! dirs
          end
        end 
      end
    end

用于输入

h = {:root =>  ["folder1/filea/x1.png", "folder1/fileb/x2.png","folder1/fileb/folder4/111", "folder2/folder3/filec/x3.png","folder2/folder3/filec/x4.png"].map{|e| e.split("/")}}

parse(h)

输出将是

{:root=>{"folder1"=>{"filea"=>{"files"=>["x1.png"]}, "fileb"=>{"files"=>["x2.png"], "folder4"=>{"files"=>["111"]}}}, "folder2"=>{"folder3"=>{"filec"=>{"files"=>["x3.png", "x4.png"]}}}}}
于 2012-05-23T16:53:19.290 回答