ugrás a tartalomhoz

Hierarchikus lista rendezése

tiku I tikaszvince · 2006. Szep. 19. (K), 13.52
Sziasztok!

Napok óta keresem megoldást (működő algoritmust) a tárgyban szereplő problémára. A lényeg, hogy van egy hierarchikus menüm (ul, li, jó sok egymásba ágyazással), amit JS épít fel, majd egy másik script segítségével ki-becsukogathatóvá varázsolom.

A generáló utasítások sorrendjét (értsd: hogy milyen sorrendben jönnek létre az egyes menüpontok) nem tudom meghatározni. Viszont a cél az, hogy a sorend olyan legyen, mint egy könyvtár struktúrának. Tehát egy olyan menüpont melynek vannak gyermekei előrébb kerül a listában, mint egy "mezei"elem. Az azonos szintű elemek pedig ABC rendben rendeződnek.

Kerestem: "(sort|order) list items" kulcsszavakkal

Az összes eddigi próbálkozásom kudarcba fulladt. Próbáltam sort() segítségével, de ha jól értem a doksit és a hibaüzeneteket, akkor ez nem alkalmazható DOM objektumokra.
Hoztam létre egy külön átmeneti tömböt, amibe bepakoltam az egyes elemeket, és így rendezni őket, de ez sem volt hajlandó működni (őszintén szólva ahibaüzenetre már nem emlékszem).

Megköszönöm az RTFM-t is, és a megfelelő hívószókat is. De megelégszem egy emberi nyelven megfogalmazott algoritmussal is :)

tiku
 
1

létrehozáskor rendezni?

zsepi · 2006. Szep. 19. (K), 15.11
nem lenne egyszerűbb még létrehozáskor rendezni? Azaz esetleg szerveroldalon?

kliens oldalon is rendezni tudod, pl. úgy hozod létre a temp tömbödet, hogy ha van gyereke, a neve elé biggyesztesz egy 'D'-t, ha nincs, akkor egy 'F'-t, s ez alapján rendezed. Rekurzivan végig kell menni az összesen persze, aminek van gyereke...

Illetve az Array.sort fv-nek paraméterként adhatsz ám összehasonlítót is, s akkor azt használja
2

létrehozáskor nem tudom

tiku I tikaszvince · 2006. Szep. 19. (K), 15.19
Mint írtam a létrehozásba, annak sorrendjébe nem tudok beleszólni. Sajnos.
Próbáltam az összehasonlító függvényt is, de azzal is volt valami.

Úgy értelmezem az elmúlt napokban elkövetett kisérletek tapasztalatait, hogy a DOM objektumok cseréjét valami miatt nem tudom végrehajtani. Mert ugye a rendezés, elemek valamilyen feltételek szerinti cseréinek sorozata.
3

rekurzív

zsepi · 2006. Szep. 19. (K), 15.41
Mint írtam a létrehozásba, annak sorrendjébe nem tudok beleszólni.

elnéztem, bocs.
function domsort(nodes) {
  var hashtable = new Object;
  var names = array(nodes.length);
  for(i = 0; i < nodes.length; i++) {
     if(nodes[i].childNodes.length > 0) {
       names[i] = "D_" + nodes[i].value; // d as directory, value ami a szoveg
       domsort(nodes[i].childNodes, names[i]);
     } else {
       names[i] = "F_" + nodes[i].value;
     }
     hashtable[names[i]] = i;
  }
  names.sort();
// dom node-ok cseréje
  for(i = 0; i < names.length; i++) {
    n = nodes[hashtables[names[i]];
    p = n.parentNode;
    p.removeChild(n);
    p.appendChild(n);
  }
}
a node-ok cseréjét azért nem lehet megcsinálni, mert ez nem egy sima index csere, hanem ezermillió függőség van. A tömbben be tudnád rendezni, csak a parentNode, prvSibling, stb. miatt nincs haszna.

A kódot nem teszteltem, csak összedobtam, a koncepció lényege, hogy előbb eltávolítod a node-ot, majd újra beszúrod. Mivel mindig a végére szúrod be, ugyanaz lesz a sorrendje, mint ami a neves tömbbé, így azt kapod, amire számítasz
4

"így azt kapod, amire számítasz"

tiku I tikaszvince · 2006. Szep. 20. (Sze), 11.26
Csak most értem odáig, hogy megnézzem. Köszönöm. Akár hiszed akár nem, így is próbálkoztam. Igaz az én próbálkozásomnak eredménye nem volt, nem történt semmilyen sorrendváltozás. Ezzel a kóddal már van sorrendváltozás, de valami gebasz mégis van.

A rendezés előtt, és után kiíratom a names-t. Gyönyörű megvannak a prefixek, rendezés után az elvárt sorrendben jelennek meg a prefixezett címek, de a végeredmény mégsem az igazi. Van olyan almenü ahol csak szigorú, eredeti érték szerinti ABC rendben vannak a menüpontok, és olyan mintha a prefixeket nem is venné figyelembe a rendezésnél.

Azt hiszem masszírozom még egy kicsit...

tiku
5

ha ne'adj isten sikerül, oszd meg velünk is!

zsepi · 2006. Szep. 20. (Sze), 12.45
üdv,
Ezzel a kóddal már van sorrendváltozás, de valami gebasz mégis van.

említettem, hogy nem teszteltem... ha sikerül, ld. tárgysor! :)