1

ディレクトリを保存するために使用されるハッシュを作成したいと思います。複数のレベルのキーが必要です。マッチポイントで、ファイルの配列が必要です。これは、コンピューター上のディレクトリ構造のようなものです。これを行うにはハッシュが最善の方法のようです。

フォルダの配列があるとすると["folder1", "folder1a", "folder1ax"]、どうすればよいですか?

  1. フォルダ構造をキーとして、ファイルを配列の値として使用してハッシュを設定し、
  2. フォルダ構造を使用してハッシュをクエリしますか?

これを使用してURLを解析し、フォルダー構造で表示します。これは、RailsアプリでJSTreeにダンプするのと非常によく似ています。したがって、Railsビューでうまく機能する5000のURLを表示するためのより良い代替手段がある場合は、代替手段を提供してください。

4

1 に答える 1

1

これが出発点です。

dirs = %w(Downloads)
Hash[ dirs.map{ |dir| [dir, Dir.glob("#{dir}/*")] } ]

結果は次のとおりです。

{"Downloads"=> ["Downloads/jquery-ui-1.9.1.custom.zip", ... ] }

コードを改良して再帰的にし、配列の結果からフォルダー名を削除することができます...これは再帰的な実装の例です。

class Dir
  def self.ls_r(dir)
    Hash[ dir,
      entries(dir).reject{ |entry| %w(. ..).include?(entry) }.map do |entry|
        entry_with_dir = File.join(dir, entry)
        File.directory?(entry_with_dir) ? ls_r(entry_with_dir) : entry
      end ]
  end
end

puts Dir.ls_r('~/Downloads').inspect 
#=> { "Downloads" => ["file1", {"Downloads/folder1"=>["subfile1"], ... ] } ... }

再帰では、子フォルダーのキーがそれぞれの親キーに対して相対的である必要があることを考慮していないため、これは最適な実装ではないことに注意してください。この問題を解決するには、この情報を再帰を通じて維持する必要があります。

class Dir
  def self.ls_r(dir, key_as_last_path_component = false)
    Hash[ (key_as_last_path_component ? File.split(dir).last : dir),
      entries(dir).reject{ |entry| %w(. ..).include?(entry) }.map do |entry|
        entry_with_dir = File.join(dir, entry)
        File.directory?(entry_with_dir) ? ls_r(entry_with_dir, true) : entry
      end ]
  end
end

puts Dir.ls_r('~/Downloads').inspect
#=> { "Downloads" => ["file1", {"folder1"=>["subfile1"], ... ] } ... }

これで、子フォルダーは親キーを基準にしています。

于 2012-11-23T13:27:33.517 に答える