Javascript: triedenie pola (vlastne)

Programovacie jazyky, rady, poradňa...
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Javascript: triedenie pola (vlastne)

Príspevok od používateľa Mek »

Zdravim, mam pole retazcov, ktore potrebujem zotriedit.
Prve, co mi napadlo, bolo pouzitie metody sort(), ale ta zoradila tak nestastne, ze najprv isli velke pismena, potom specialne znaky a potom male pismena. Tak som zacal googlit, ale nic moc som nenasiel, len zopar funkcii, ktore bud nefungovali tak, ako som chcel, alebo nefungovali vobec.
Najlepsie z toho vysla tato funkcia:

Kód: Vybrať všetko

Array.prototype.naturalSort = function() {
  var p, q, valueOf = function(t) {
    return isNaN(t) ? t.charCodeAt(0) :
        Number(t) - Math.pow(2,32);
  };
  return this.sort(function(a,b) {
    var values = [a,b].map(function(s) {
      return s.toString().toLowerCase()
         .match(/([a-z]|[0-9]|[\[\]\(\)]+(?:\.[0-9]+)?)/ig);
     });
    a = values[0]; b = values[1];
    for (var i = 0, n = Math.min(a.length, b.length); i < n; i++) {
      p = valueOf(a[i]), q = valueOf(b[i]);
      if (p != q) return p - q;
    }
    return a.length - b.length;
  });
};
Ta zoraduje tak, ze najprv idu specialne znaky, a potom pismena, nezavisle na velkosti (case insensitive). Ale ma jeden zasadny problem - ze je extremne pomala. Pole o velkosti 100 je zoradene hned, ale ked som dal zoradit 1700 poloziek, tak sa ma firefox musel dvakrat opytat, ci chcem skript ukoncit, alebo pockat :lol:
Takze potrebujem nejake lepsie riesenie. Tej funkcii, ktoru som sem postol, skoro vobec nerozumiem, snazil som sa ju upravit tak, aby isli najprv vsetky specialne znaky, a pre zaciatok som namiesto vsetkych specialnych znakov urcil len zatvorky ( ) [ ] (vid regularny vyraz). Lenze ja nie som s regularnymi vyrazmi moc kamarat, tak prosim aj o radu, ako to spravit tak, aby v zoradenom poli isli najprv vsetky specialne znaky, zatvorky atd, potom cislice, a nakoniec pismena nezavisle na velkosti.
Nemate niekto niekde takuto funkciu? Dost by bodla :wink:
(Ka+ za pomoc zarucena)

//edit: no a teraz som skusil pomocou klasickej metody sort() zoradit tych 1700 poloziek, a tu rovnako prehliadac dvakrat zamrzol.... tak co s tym? :hmm:
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Čo vlastne potrebuješ pomocou toho JS zoradiť? Nemôžeš to poslať už zoradené?
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

Posielam zoznam uzivatelov DC hubu a nechcem to posielat uz zoradene, lebo aj tak budem potrebovat potom, ked sa pripoji novy uzivatel, ho zaradit na spravne miesto kam patri podla nicku, ale to som este nepremyslel.
No a prave teraz som zistil, ze nie zoradenie je pomale, ale vytvaranie tagov TR a TD a nasledne appendChild k table elementu cez javascript je pomale :cry:
Lenze ja to potrebujem mat v tabulke, kedze ku kazdemu uzivatelovi tam bude jeho zdielanie, popis, tag, IP a dalsie veci :?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

Mek napísal:Posielam zoznam uzivatelov DC hubu a nechcem to posielat uz zoradene, lebo aj tak budem potrebovat potom, ked sa pripoji novy uzivatel, ho zaradit na spravne miesto kam patri podla nicku, ale to som este nepremyslel.
to ne je pravda. Zaradenie jedného záznamu do zotriedeného súboru je omnoho rýchlejšie a jednoduchšie ako zoradiť 1700 záznamov
Mek napísal:No a prave teraz som zistil, ze nie zoradenie je pomale, ale vytvaranie tagov TR a TD a nasledne appendChild k table elementu cez javascript je pomale :cry:
Lenze ja to potrebujem mat v tabulke, kedze ku kazdemu uzivatelovi tam bude jeho zdielanie, popis, tag, IP a dalsie veci :?
Skúšal si vytvoriť tabulku naraz (vieš predsa počet prvkov v array) namiesto vytvárania po jednotlivých riadkoch? Alebo to nemusíš dávať do tabulky, ale sa môžeš pohrať s css
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

hmm... este raz: mam stranku, kde sa zo servera z php skriptu posiela zoznam uzivatelov, a na strane klienta tento zoznam spracuvam tak, ze tento dlhy retazec rozbijem na pole, toto pole utriedim a pre kazdy prvok toho pola vytvorim <tr><td></td></tr> (pomocou document.createElement), a toto vsetko pripojim k <table> elementu, ktory je iba jeden (pomocou appendChild).
Teda funguje to ajax-ovsky (to som asi zabudol zmienit). Co je pomale, je spracovanie takeho dlheho zoznamu uzivatelov na strane klienta. Snad som to vysvetlil uz jasnejsie, i ked uz sme asi off-t(r)opic :?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Rozdeliť reťazec trvá dosť dlho, zotriedenie ešte dlhšie. Vytvoriť tie elementy a pridať ich do tabuľky je záležitosť zlomku sekundy.

PS: Ako môže byť popis problému offtopic?
PPS: To chceš naozaj zobraziť všetky údaje v jednej tabuľke?
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

ano, potrebujem to mat v jednej tabulke.
btw prave som zistil, ze najnarocnejsia operacia je zrejme split() takeho dlheho retazca (zoznam uzivatelov posielam ako dlhy retazec s nickmi oddelenymi urcenym delimiterom).
skusim kuknut na nete, ci neexistuje nejaka schodnejsia (=rychlejsia) cesta, ale to az zajtra... nateraz vdaka za ochotu a bru noc :oops:
zaggi
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 314
Registrovaný: 04 feb 2007, 19:32

Príspevok od používateľa zaggi »

zoradiť 1700 záznamov
pozor, javascript by ani nemal robit taketo operacie s takym poctom zaznamov, IE ma dokonca protekciu ze po urcitom pocte riadkov vyhodi spravu "script is running too long..." (nezavisi od casu ale nelogicky od poctu riadkov), na toto bacha :)
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

No tak som to urobil uplne inac - rozparsoval som ten dlhy retazec na strane servera a poslal som zoznam uzivatelov ako xml dokument, a na strane klienta zase odtial vytiahol data a spracoval.
Problem je, ze prehliadac sa stale zasekava a upozornuje, ze skript neodpoveda a bla bla bla :roll:
no ja neviem ale asi uz niet inej cesty... uz mi z toho sibe
pritom toto sa deje vo firefoxe, opera s tym nema ziadne problemy, nezasekne sa, len sa trochu spomali, ale vsetko spracuje a to pomerne rychlo. V IE to cele nefunguje poriadne, tak som to nemal moznost vyskusat.
:roll:
asi ma firefox problem so spracovanim extremne dlhych retazcov posielanych ajaxovsky... inak si to uz neviem vysvetlit :?
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Aj tak stále nechápem, prečo to musíš mať všetko na jednej stránke. Navyše spracovávať dlhý reťazec nie je najlepší nápad. Ďalší problém je, že nevieme, čo všetko vlastne v tom JS robíš (a ako).
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

neposielaj to ako XML. na serveri si z toho urob JSON a v JS to budes mat hned ako pole.
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

chrono, poznas siet DirectConnect? tak na nu je klient DC++, z ktoreho su odvodeni prakticky vsetci dalsi klienti. No a ja sa pokusam zrobit nieco take v php, ale iba na chat. A k tomu potrebujem mat nacitany zoznam uzivatelov, aby sa im dali posielat sukromne spravy a aby sa mohol v realnom case udrziavat aktualny (ak pride novy clovek na hub, alebo ak niekto odide).
mastermind, o json som uz cosi pocul, ale nemam o tom blizsieho tucha, tak pogooglujem a snad to vyjde.
inak mi napadlo, ze by som to mohol posielat na viac krat, ale to by sa asi ten userlist dlho nacitaval...
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Teda keby som chcel niekomu poslať správu, tak sa mi objaví combobox s 1700 ľuďmi? Ak je to tak, tak si myslím, že je to extrémne neprehľadné.

A ak tam máš v tom zozname nejaké vyhľadávanie, tak by som filtrovanie urobil cez php+AJAX. Teda cez AJAX by sa poslal filter, php by vygenerovalo odpoveď (napr. prvých 25 ľudí) a vrátilo by odpoveď. Na tej stránke by si mal samozrejme prvky, pomocou ktorých by si sa mohol posunúť na ďalšiu skupinu 25 ľudí...

Každopádne ja by som chat robil (pravdepodobne) tak, aby sa využil AJAX (a podobné "čary") v čo najväčšej miere.
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

kdeze, combobox nehrozi :)
je tam jedna tabulka, kde na kazdom jej riadku je jeden uzivatel, s dalsimi informaciami (share, ip, ...), ma to skratka take iste rozlozenie ako klasicke DC++ :wink: a sukromna sprava sa odosle po kliknuti na nick. Preto aj, aby bolo jednoduche nick najst, by som to chcel mat usporiadane a tak to aj udrziavat.

//autoeditácia príspevku ( 15 Aug 2008, 17:17 )
Mno, tak som poriesil ten json a vyrazne sa to zrychlilo. Ale napr. PtokaX (hubsoft), ked si vypytam userlist, tak mi posle namiesto nicklistu kompletne informacie o vsetkych useroch (MyInfo), a to je teprve zataz :D no a to uz som cez json neporiesil, dal som tam len aby sa to nacitavalo po castiach a uz problemy so sekanim browseru nie su :) Uz len vymysliet, ako to udrziavat v usporiadanom stave :hmm:
Napísať odpoveď