Отображение массива записей со значениями глубины во вложенный неупорядоченный список - PullRequest
1 голос
/ 24 февраля 2010

Надеюсь, этот вопрос еще не задавался:

Я использую камень предков для управления своей древовидной структурой. Я использую функцию, которая возвращает потомков узла на определенное количество уровней. Вот упрощенный пример того, что он возвращает:

[{:name => 'node 1', :depth => 1}, {:name => 'node 2', :depth => 2}
 {:name => 'node 3', :depth => 1}, {:name => 'node 4', :depth => 1}]

В действительности это записи, упорядоченные правильно, так что все дочерние элементы, внуки и т. Д. Записи появляются после этой записи, поэтому мы можем предположить, что «узел 2» является потомком «узла 1». Мы также можем доказать это с помощью дополнительной информации, которую возвращает метод, которую я не включил в этот пример, чтобы упростить ее.

Я хочу превратить это в неупорядоченный список наиболее эффективным способом:

<ul>
  <li>node 1
    <ul>
      <li>node 2</li>
    </ul>
  </li>
  <li>node 3</li>
  <li>node 4</li>
</ul>

И вот где я застрял. Наличие упорядоченного массива значений, подобного приведенному выше, отлично подходит для избежания рекурсивного кода, который обычно требуется использовать для создания неупорядоченного списка. Я думаю, что, возможно, простое сопоставление членов массива и вставка соответствующих UL и LI будет самым быстрым способом?

Ждем ваших идей!

Брендон

1 Ответ

1 голос
/ 24 февраля 2010

Этот шаблон ERB должен помочь. Извлеките код для помощника или частично для аккуратности.

<%
# lets assume that your array is an a variable
# called list
list = [ {:name => 'node 1', :depth => 1}, 
         {:name => 'node 2', :depth => 2},
         {:name => 'node 3', :depth => 1}, 
         {:name => 'node 4', :depth => 1}]

%>
<% depth = 1%>
<ul>
<%list.each do |cfg|%>
  <%if depth < cfg[:depth] %> 
    <ul>
  <%elsif depth > cfg[:depth] %>
      <%
      # take care of the free fall
      (depth - cfg[:depth]).times do
      %>
        </ul>   
      <%end%>
  <%end%>
  <li> <%= cfg[:name] %></li>
  <%depth = cfg[:depth] %>
<%end%>
<%
# take care of the final free fall 
depth.times do 
%>
  </ul>
<%end%>
...