« 1 2 »
Autor Zpráva
lopikol
Profil
Rozhodl jsem se použít rychlejší řazení, než to celé řešit přes php, a to jquery. Do oka mi padl plugin http://tablesorter.com/docs/, jenže zde je jeden problém. Nepodporuje češtinu.

Nemáte nápad jak to vyřešit, případně poradili byste mi ekvivalentní náhradu? Děkuji.
Nox
Profil
Však na té stránce máš
"Parsers for sorting text, URIs, integers, currency, floats, IP addresses, dates (ISO, long and short formats), time. Add your own easily" => http://tablesorter.com/docs/example-parsers.html
lopikol
Profil
Ano o téhle funkci vim, používám (samozřejmě s vlastními pravidly) na řazení času, ale vůbec nevím, jak tam přidat podmínku pro řazení čšřž...
Kajman_
Profil *
Co třeba zavolat replace na text tak, aby výsledek už byl řazený dobře?

Třeba chrobáček převést na h1r0o0b0a0c1e0k0 nebo na h{robac{ek
lopikol
Profil
No ježe když to převedu (Č > C, Ř > R), tak to řazení nebude správné.
Kajman_
Profil *
Proto tam je navíc ta jednička či špidlatá závorka. Také se můžete mrknout na metodu localeCompare u stringu, ale ta by se musela našroubovat v kódu jinam než do parseru.
Chamurappi
Profil
Reaguji na lopikola:
Viz Třídění pole dle české abecedy.
lopikol
Profil
Kajman:
Jj díky

Chamurappi:
Ted to jen nějak napasovat na ten parser od tablesort
lopikol
Profil
Tak už to mám, ale potřeboval bych prohodit směr řazení. Úpravou toho kodu, jelikož celý řadí opačně něž sorttable. Poradí někdo?
var localeCompare = (function() {
    var chars = "aáäàãâbcćčdďeéěëèêfghiíïìîjklĺľmnńňñoóôòõöőpqrŕřsśštťuúùůüũûvwxyýzźž" ;
    chars = chars.replace(/./g, function($0) { return $0 + $0.toUpperCase()});
    var sorted = chars.split("").sort().join("");
    var map = {};

    for (var i = 0; i < chars.length; ++i)
        if (chars.charAt(i) != sorted.charAt(i))
            map[chars.charAt(i)] = sorted.charAt(i);

    return function(a, b) {
        for (var i = 0, len = Math.min(a.length, b.length); i < len; ++i) {
            var c, c1 = a.charAt(i), c2 = b.charAt(i);
    
            if (c = map[c1]) c1 = c;
            if (c = map[c2]) c2 = c;
            if (c1 < c2) return -1;
            if (c1 > c2) return 1;
        }
    
        return a.length != b.length ? a.length - b.length : 0;
    }
})(); 
 
 $.tablesorter.addParser({
  id: "mytext",
  is: function (s) {
    return false;
  }, format: function (s) {
    return function(a, b) { return localeCompare(a[0], b[0]); };
  }, type: "text"
 });
lopikol
Profil
Zjistil jsem, že mi stačí to omezit pouze na:
 var localeCompare = (function() {
    var chars = "aáäàãâbcćčdďeéěëèêfghiíïìîjklĺľmnńňñoóôòõöőpqrŕřsśštťuúùůüũûvwxyýzźž" ;
    chars = chars.replace(/./g, function($0) { return $0 + $0});
 })(); 
 
 $.tablesorter.addParser({
  id: "mytext",
  is: function (s) {
    return false;
  }, format: function (s) {
    return function(a, b) { return localeCompare(a[0], b[0]); };
  }, type: "text"
 });
lopikol
Profil
Takže to nefunguje.

Kdyby někdo věděl jak na to, a poradil mi, tak budu moc rád.
lopikol
Profil
Zjistil jsem, že stačí pouze:
 $.tablesorter.addParser({
  id: "mytext",
  is: function (s) {
    return false;
  }, format: function (s) {
     return function(a, b) { return localeCompare(a[0], b[0]); };
  }, type: "text"
 });  


Jenže stále to neřeší ten problém, že to řadí vzůro nohama.
_es
Profil
lopikol:
to řadí vzůro nohama
Na opačné poradie stačí, aby porovnávacia funkcia vracala opačné hodnoty, teda stačí napríklad v definícii funkcie prehodiť argumenty.
Chamurappi
Profil
Přemýšlím, proč jsou v té původní losově funkci ty indexy [0]… a nějak mi to na první pohled není jasné.


Reaguji na lopikola:
Zjistil jsem, že stačí pouze
Ne. Postupně jsi tu funkci zmršil a teď jsi ji odmazal úplně, ale přesto ji voláš (přesně stejně jako na začátku) — takže uvedený kód nestačí.
lopikol
Profil
_es:
Ono to vůbec nefunguje.

Díky pouze tomuhle to taky řadí dle české abecedy, ale stále je nahoře Ž

 $.tablesorter.addParser({
  id: "mytext",
  is: function (s) {
    return false;
  }, format: function (s) {
     return function() {};
  }, type: "text"
 }); 
lopikol
Profil
Chamurappi:
Ikdyž tu funkci použiju tak jak je napsaná a "nezmršim ji", tak výsledek je stejnej řadí to stále opačně, přijde mi, že to vůbec localeCompar() nebere v potaz.

Je jedno jestli použiji #15 nebo #9. Výsledek je úplně stejný.
_es
Profil
lopikol:
Díky pouze tomuhle
A kde tam je tá porovnávacia funkcia?
Porovnávacia funkcia má dva argumenty, nikde tam taká funkcia nie je.

Umožňuje vôbec ten jQuery plugin zadanie vlastnej porovnávacej funkcie?
lopikol
Profil
_es:
Však jsem psal #16

Když použiju toto (i s data.sort(...)), tak je to sice seřaené podle abecedy, ale nemohu měnit řazení kliknutím.

var localeCompare = (function() {
    var chars = "aáäàãâbcćčdďeéěëèêfghiíïìîjklĺľmnńňñoóôòõöőpqrŕřsśštťuúùůüũûvwxyýzźž" ;
    chars = chars.replace(/./g, function($0) { return $0 + $0.toUpperCase()});
    var sorted = chars.split("").sort().join("");
    var map = {};

    for (var i = 0; i < chars.length; ++i)
        if (chars.charAt(i) != sorted.charAt(i))
            map[chars.charAt(i)] = sorted.charAt(i);

    return function(a, b) {
        for (var i = 0, len = Math.min(a.length, b.length); i < len; ++i) {
            var c, c1 = a.charAt(i), c2 = b.charAt(i);
    
            if (c = map[c1]) c1 = c;
            if (c = map[c2]) c2 = c;
            if (c1 < c2) return -1;
            if (c1 > c2) return 1;
        }
    
        return a.length != b.length ? a.length - b.length : 0;
    }
})(); 

 $.tablesorter.addParser({
  id: "mytext",
  is: function (s) {
    return false;
  }, format: function (s) {
    return data.sort(function(a, b) { return localeCompare(a[0], b[0]); });
  }, type: "text"
 }); 
Chamurappi
Profil
Reaguji na lopikola:
Musíš si z localeCompare vypreparovat ten mechanismus na přeuspořádání pořadí znaků a použít ho na vstup funkce format. Pokud se zamyslíš nad tím, jak losova funkce localeCompare funguje a pochopíš její vnitřnosti, měl bys to zvládnout.
lopikol
Profil
Chamurappi:
funguje a pochopíš její vnitřnosti, měl bys to zvládnout.
Kéž by

Zjistil jsem, ž v tom s (patří tablesort), je vždy řádek v daném sloupci,takže jak to nějak rozdělit na a a b nevim.
Chamurappi
Profil
Reaguji na lopikola:
Já to pochopil tak, že funkce format dostane na vstupu obsah buňky, a na výstupu má být jakýsi zástupný řetězec — a pak se řádky řadí podle toho zástupného řetězce. Čili nehledáš způsob, jak s rozdělit, ale jak ho změnit tak, aby ze všech s vylezlo něco, co jde setřídit obyčejným sortem. V losově funkci mechanismus na určení zástupných znaků je.
lopikol
Profil
já to s nemohu nikam dostat, už jsem zkusil vše co mě napadlo, ale prostě to stále nejde :(

hledal jsem a ani plugin, který by zvládl řazení dle české abecedy pomocí jquery není :(
Chamurappi
Profil
Reaguji na lopikola:
Tak zkus něco, co tě nenapadlo. Nebo ukaž, co zkoušíš…

já to s nemohu nikam dostat
Kam bys ho chtěl dostávat? Funkci localeCompare používat nebudeš, jen se jí inspiruješ při zpracovávání s.
lopikol
Profil
Chamurappi:
Kam bys ho chtěl dostávat? Funkci localeCompare používat nebudeš, jen se jí inspiruješ při zpracovávání s.
Ano to zkoušim, ale když já mám pouze jednu proměnou s ale v příkladu je porovnání a to já nemůhu udělat :/
Chamurappi
Profil
Reaguji na lopikola:
Koukal jsem se teď do zdrojáků toho používaného pluginu, jestli náhodou neumožňuje předat jako vstup porovnávací funkci, což by bylo pro tebe nejjednodušší a docela přirozené a normální… a zjistil jsem, že autor pluginu sám není normální, protože svůj třídící mechanismus vcelku pitomě založil na sestavování řetězců a na evalu. Docela humus. Vzhledem k tomu, že k problému přistupuješ docela konzumně, nechceš si raději najít nějaký rozumně napsaný plugin? Nějaký, kterému by šlo předat localeCompare na vstupu?
lopikol
Profil
Chamurappi: Kdyby jsi věděl o jquery pluginu, který bude umět toto žazení, tka to bude super. Na tomto pluginu bylo dobré, že například jsem měl sloupec, kde byla data:
99 min, 101 min, 55 min .... a vadilo tomu právě to slovo min, tak jsem ho pomocí tohoto kodu "odstranil", resp. skryl pro řazení a bylo to vše ok ;) Jeikož do té doby to nejdřív seřadilo dvojmístná čísla a poté trojmístná, takže to bylo od 99-0 a pak od 999-100 atd...

 $.tablesorter.addParser({
  id: "mytime",
  is: function (s) {
    return /\ min$/.test($.trim(s));
  }, format: function (s) {
    return $.tablesorter.formatFloat(s.replace(new RegExp(/ min/g), ""));
  }, type: "numeric"
 }); 
lopikol
Profil
Neznáte někdo teda podobný js? Děkuji moc mi pomůžete ;)
Chamurappi
Profil
Reaguji na lopikola:
Tebou nalezený plugin umí několik různých věcí (i něco s metadaty…), takže jaké máš konkrétně požadavky? Potřebuješ jen třídit řádky v jednom <tbody>, jejichž buňky nemají rowspan, ani colspan, při kliknutí na buňky v odpovídajících sloupcích v <thead>? To není moc těžké napsat.
lopikol
Profil
Chamurappi:
Ano přesně tak + aby to ukazovalo černou šipečku, která by ukazovala směr řazení ,to odstranění/skrytí části textu (#26) a možnost nastavení řazení ihned po načtení stránky.

Možná dalo, ale né já :/
karel_
Profil *
podobný skript, který umí řadit podle zadaného indexu:
http://www.kryogenix.org/code/browser/sorttable/ (atribut sorttable_customkey)
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0