2010-02-24 52 views
1

我希望這個問題還沒有被問過:我使用的是祖先的寶石來管理我的樹結構映射記錄的深度值的數組嵌套的無序列表

。我正在使用一個函數,它將節點的後代返回到一定數量的級別。下面是它返回的一個簡單的例子:

[{: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> 

而這正是我卡住了。擁有如上所述的有序數組數組對於避免通常需要使用的遞歸代碼來生成一個nester無序列表非常有用。我在想,也許簡單地映射陣列成員並插入合適的UL和LI將是最快的方法?

期待看到您的想法!

Brendon

回答

1

這個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%> 
+0

看起來不錯謝謝:)不幸的是,需要它已經走了,因爲我是假設太多傳入的數據,這是不正確的順序,因爲它沒有考慮到父母子女關係的信息。希望這對未來的人有所幫助:) – 2010-03-03 00:49:29

+0

@KandadaBoggu:謝謝你的回答 - 它也幫助了我。 – 2011-10-05 19:51:25

+0

謝謝,這節省了我一大堆時間。我想不出一種優雅的方式將它翻譯成HAML,所以我現在只用了一個:erb,但它的功能就像一個魅力。 – 2013-01-05 05:46:27