2010-02-24 7 views
1

J'espère que cette question n'a pas été posée:un tableau d'enregistrements avec des valeurs de profondeur dans une liste non triée imbriquées

J'utilise la pierre d'origine pour gérer ma structure d'arbre. J'utilise une fonction qui renvoie les descendants d'un nœud à un certain nombre de niveaux. Voici un exemple simpliste de ce qu'il est de retour:

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

En réalité, ceux-ci sont des documents commandés correctement afin que tous les enfants, petits-enfants, etc ... d'un enregistrement apparaissent après cet enregistrement, on peut donc supposer que « nœud 2 'est l'enfant du' noeud 1 '. Nous pouvons également le prouver avec les informations supplémentaires que la méthode retourne que je n'ai pas incluses dans cet exemple pour le rendre plus simple.

Je suis désireux de transformer cela en une liste non ordonnée de la manière la plus efficace possible:

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

Et c'est là où je suis coincé. Avoir un tableau ordonné de valeurs comme ci-dessus est génial pour éviter le code récursif normalement utilisé pour produire une liste non ordonnée de nier. Je pense que peut-être que simplement cartographier les membres de la matrice et insérer les UL et LI appropriés serait le moyen le plus rapide d'y aller?

Dans l'attente de voir vos idées!

Brendon

Répondre

1

Ce modèle de ERB devrait faire l'affaire. Extraire le code à un assistant ou un partiel pour la propreté.

<% 
# 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

semble bon merci :) Malheureusement, la nécessité est allé comme je supposais trop sur les données entrantes, il n'a pas été dans l'ordre comme il n'a pas tenu compte des informations de filiation. J'espère que cela sera utile à quelqu'un dans le futur :) –

+0

@KandadaBoggu: Merci pour cette réponse - ça m'a aidé aussi. –

+0

Merci, cela m'a juste sauvé un tas de temps. Je ne pouvais pas trouver une manière élégante de le traduire en HAML, alors j'ai juste utilisé un erb pour l'instant, mais ça a fonctionné comme un charme. –