Autor | Zpráva | ||
---|---|---|---|
lopikol Profil |
#1 · Zasláno: 1. 11. 2011, 13:07:05
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 |
#2 · Zasláno: 1. 11. 2011, 13:34:29
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 |
#3 · Zasláno: 1. 11. 2011, 14:52:45
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 * |
#4 · Zasláno: 1. 11. 2011, 15:47:34
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 |
#5 · Zasláno: 1. 11. 2011, 16:08:05
No ježe když to převedu (Č > C, Ř > R), tak to řazení nebude správné.
|
||
Kajman_ Profil * |
#6 · Zasláno: 1. 11. 2011, 16:16:58
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 |
#7 · Zasláno: 1. 11. 2011, 16:22:43
Reaguji na lopikola:
Viz Třídění pole dle české abecedy. |
||
lopikol Profil |
#8 · Zasláno: 1. 11. 2011, 17:09:22
Kajman:
Jj díky Chamurappi: Ted to jen nějak napasovat na ten parser od tablesort |
||
lopikol Profil |
#9 · Zasláno: 1. 11. 2011, 20:18:02 · Upravil/a: lopikol
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 |
#10 · Zasláno: 1. 11. 2011, 20:59:43 · Upravil/a: lopikol
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 |
#11 · Zasláno: 1. 11. 2011, 21:13:19 · Upravil/a: lopikol
Takže to nefunguje.
Kdyby někdo věděl jak na to, a poradil mi, tak budu moc rád. |
||
lopikol Profil |
#12 · Zasláno: 2. 11. 2011, 09:55:38
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 |
#13 · Zasláno: 2. 11. 2011, 10:35:47
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 |
#14 · Zasláno: 2. 11. 2011, 11:19:29
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 |
#15 · Zasláno: 2. 11. 2011, 11:19:47
_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 |
#16 · Zasláno: 2. 11. 2011, 11:26:17 · Upravil/a: lopikol
|
||
_es Profil |
#17 · Zasláno: 2. 11. 2011, 11:32:52 · Upravil/a: _es
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 |
#18 · Zasláno: 2. 11. 2011, 11:43:27
_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 |
#19 · Zasláno: 2. 11. 2011, 16:08:00
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 |
#20 · Zasláno: 2. 11. 2011, 17:55:42 · Upravil/a: lopikol
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 |
#21 · Zasláno: 2. 11. 2011, 18:56:53
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 sort em. V losově funkci mechanismus na určení zástupných znaků je.
|
||
lopikol Profil |
#22 · Zasláno: 2. 11. 2011, 19:21:05 · Upravil/a: lopikol
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 |
#23 · Zasláno: 2. 11. 2011, 19:27:20
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 |
#24 · Zasláno: 2. 11. 2011, 19:49:10
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 |
#25 · Zasláno: 2. 11. 2011, 20:33:00
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 eval u. 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 |
#26 · Zasláno: 2. 11. 2011, 20:39:36 · Upravil/a: lopikol
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 |
#27 · Zasláno: 3. 11. 2011, 21:07:37
Neznáte někdo teda podobný js? Děkuji moc mi pomůžete ;)
|
||
Chamurappi Profil |
#28 · Zasláno: 3. 11. 2011, 22:22:27
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 |
#29 · Zasláno: 3. 11. 2011, 22:53:19
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 * |
#30 · Zasláno: 4. 11. 2011, 14:49:05
podobný skript, který umí řadit podle zadaného indexu:
http://www.kryogenix.org/code/browser/sorttable/ (atribut sorttable_customkey) |
||
Téma pokračuje na další straně.
|
0