0

次のようなファイルパスコンポーネントの配列があります。

[ ['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>

ありがとう、私はどんな考えでもありがたいです。

4

1 に答える 1

1

大まかな概要; 可能な限りシンプルにします(つまり、物事をシンプルに保つためのトリックはありません:)

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などのgemと組み合わせて、手動で行う必要のある忙しい作業の量を減らしたりできます。

これは、データが病的でないことを確認するための「健全性チェック」も行いません。たとえば、ファイル名をディレクトリに変換する配列を作成したり、ファイル名でディレクトリを消去したりできます。読者に残された演習。

于 2012-06-23T01:03:11.203 に答える