2010-02-24 8 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를 삽입하는 것이 가장 빠른 방법 일 것이라고 생각합니다.

앞으로 귀하의 아이디어를보고 싶습니다!

브렌 든

답변

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

감사합니다. 불행히도 내가 들어오는 데이터에 대해 너무 많이 추측 했으므로 불행히도 그 필요성이 사라졌습니다. 올바른 정보가 아니라 태아 정보를 고려해야했기 때문입니다. 다행히도 이것은 미래의 누군가에게 도움이 될 것입니다 :) –

+0

@KandadaBoggu :이 답변을 주셔서 감사합니다. –

+0

고마워, 방금 시간이 많이 절약되었습니다. 나는 그것을 HAML로 번역하는 우아한 방법을 생각할 수 없었다. 그래서 나는 단지 그것을 안에 사용했다 : erb 이제는 그것의 내부지만 매력처럼 작동했다. –