Autor | Zpráva | ||
---|---|---|---|
vacjos Profil * |
#1 · Zasláno: 10. 3. 2008, 18:15:07
Ahoj,
mohl by mi někdo poradit, jak setřídit pole dle české abecedy, tzn. AÁBCČDĎEÉĚ,... Má databáze vypadá asi takto: var data= new Array(); data[0] = new Array ('a',y); data[1] = new Array ('č','x',''); data[2] = new Array ('š','z',''); data[3] = new Array ('s','q',''); ... Na třídění používám: var celkovy_pocet = data.length; j = celkovy_pocet; while (j > 1) { j = celkovy_pocet-1; i = 0; while (i < celkovy_pocet-1) { if (data[i][0].toUpperCase() > data[i+1][0].toUpperCase()) { for (co = 0; co < 3; co++) { help = data[i][co]; data[i][co] = data[i+1][co]; data[i+1][co] = help; } } else {j--;} i++; } } Pro výpis mám: for (j = 0;j < celkovy_pocet; i++) {document.write(data[i][0] + ' - ' + data[i][1] + '<BR>');} Moc dík |
||
peta Profil |
#2 · Zasláno: 10. 3. 2008, 18:17:01
http://www.volny.cz/peter.mlich/www.htm#msub8
http://peter-mlich.wz.cz/x/ww/js/jspriklady.htm # js-tab napsat si vlastni tridici funkci |
||
nightfish Profil |
#3 · Zasláno: 10. 3. 2008, 18:20:31
jak setřídit pole dle české abecedy, tzn. AÁBCČDĎEÉĚ,...
1) ne setřídit, nýbrž seřadit (třídění = rozdělení do tříd) 2) české řazení je ještě zkomplikováno tím, že se řadí dvoufázově (pro více informací viz sekci Čeština na http://cs.wikipedia.org/wiki/Abecedn%C3%AD_%C5%99azen%C3%AD), čemuž je potřeba přizpůsobit řadicí algoritmus 3) možná by to k tvému kódu chtělo nějaký komentář, usnadníš tím jeho pochopení lidem, kteří ti budou chtít pomoct (moc jsem třeba nepobral to pole na začátku) |
||
vacjos Profil * |
#4 · Zasláno: 10. 3. 2008, 18:55:33
To pole na začátku je jen způsob zápisu mé databáze. Chci vytvořit něco jako speciální výkladový slovníček jako součást mého specializovaného webu. Mám tam tedy data typu:
data[0] = new Array ('pojem',výklad pojmu); Postačí mi tedy seřazení pole podle sloupce "pojem". Jsem začátečník, tak pokud by mi někdo pomohl více s mim konkrétnim příkladem (petovo odkazy jsou na mne moc komplikovane) byl bych moc vděčný. |
||
Leo Profil |
#5 · Zasláno: 10. 3. 2008, 20:27:55
|
||
los Profil * |
#6 · Zasláno: 10. 3. 2008, 22:29:35
data.sort(function(a, b) { return a[0].localeCompare(b[0]); });
|
||
vacjos Profil * |
#7 · Zasláno: 11. 3. 2008, 11:10:19
los
Tohle je přesně ono:-)). V IE,FF a Safari super,jen mi to nejede v Opeře. Nejde to nějak upravit pro Operu? I tak moc moc dík |
||
Leo Profil |
#8 · Zasláno: 11. 3. 2008, 11:35:13
Opera je s odpustenim prohlizec na dve veci, jakmile dojde na js, Leo
|
||
peta Profil |
#9 · Zasláno: 11. 3. 2008, 15:38:30
vacjos
funguje ti priklad s JS tab v opere? http://peter-mlich.wz.cz/x/ww/js/jspriklady.htm # js-tab jedine, co tam potrebujes, prepsat serazovaci funkci podle sebe. Dokumentaci k JS, ktery podporuje opera najdes na strankach Opery. Je mozne, ze funkci localeCompare nema, protoze Opera toho nema vice ani ze zakladnich JS operaci. Proste autori pouzivaji uplne jine funkce nez zbytek lidu. |
||
Leo Profil |
#10 · Zasláno: 11. 3. 2008, 16:04:07
"Je mozne, ze funkci localeCompare nema"
Ma, zna ji, ale neserazuje cesky, Leo |
||
los Profil * |
#11 · Zasláno: 11. 3. 2008, 19:02:50
Keď vieš vymenovať vzostupne všetky znaky, ktoré použiješ, tak si môžeš napísať vlastnú funkciu na usporiadanie. Napr. kedysi som použil niečo takéto:
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; } })(); data.sort(function(a, b) { return localeCompare(a[0], b[0]); }); |
||
los Profil * |
#12 · Zasláno: 11. 3. 2008, 20:33:57
Ešte toto: return a.length != b.length ? a.length - b.length : 0;
by šlo zapísať rovno takto: return a.length - b.length; |
||
Časová prodleva: 2 roky
|
|||
kabanos Profil * |
#13 · Zasláno: 7. 8. 2010, 14:41:00
Omlouvám se, že otvírám staré téma, ale hledám také spolehlivé třídění vícerozměrového pole podle české diakritiky. To od lose mi ale nefunguje správně. Nevíte někdo nápravu nebo něco hotového jiného?
Testoval jsem to na příkladu: var data = new Array(); data[0] = new Array ('ant','L'); data[1] = new Array ('bak','J'); data[2] = new Array ('cel','S'); data[3] = new Array ('bíl','('); data[4] = new Array ('bet','Ž'); data[5] = new Array ('cho','L'); A výsledek je: ant,bak,cel,bet,cho,bíl Místo: ant,bak,bet,bíl,cel,cho Díky |
||
kabanos Profil * |
#14 · Zasláno: 7. 8. 2010, 16:30:43
Tak nakonec jsem si to vymyslel sám:
function sortByChars(arr) { var out = new Array(); var chars = ' aáäaaâbcćčdďeéěëeefghiíiiîjklĺľmnńňnoóôooöőpqrŕřsśštťuúuůüuuvwxyýzźž0123456789'; for (var k = 0; k < arr.length; k++) { var index = ''; for (var j = 0; j < arr[k][0].length; j++) { var i = chars.toUpperCase().indexOf(arr[k][0].substr(j,1).toUpperCase()) if (i < 10) {index = index+'0'+i;} else {index = index+i;} } out[k] = arr[k].concat(index); } return out; } function compare(a, b) { if (a < b) {return -1;} if (a > b) {return 1;} return 0; } data = sortByChars(data); data.sort(function(a,b) {return compare(a[2], b[2]);}); |
||
kabanos Profil * |
#15 · Zasláno: 7. 8. 2010, 16:32:31
Omlouvám se, to samé jen zformátováno:
function sortByChars(arr) { var out = new Array(); var chars = ' aáäaaâbcćčdďeéěëeefghiíiiîjklĺľmnńňnoóôooöőpqrŕřsśštťuúuůüuuvwxyýzźž0123456789'; for (var k = 0; k < arr.length; k++) { var index = ''; for (var j = 0; j < arr[k][0].length; j++) { var i = chars.toUpperCase().indexOf(arr[k][0].substr(j,1).toUpperCase()) if (i < 10) {index = index+'0'+i;} else {index = index+i;} } out[k] = arr[k].concat(index); } return out; } function compare(a, b) { if (a < b) {return -1;} if (a > b) {return 1;} return 0; } data = sortByChars(data); data.sort(function(a,b) {return compare(a[2], b[2]);}); |
||
Kajman_ Profil * |
#16 · Zasláno: 7. 8. 2010, 17:28:43
Přijde mi, že to neumí dát ch za h.
|
||
kabanos Profil * |
#17 · Zasláno: 7. 8. 2010, 20:45:18
Já jsem to sice nepotřeboval, ale jde to jednoduše napravit:
function sortByChars(arr) { var out = new Array(); var chars = ' aáäaaâbcćčdďeéěëeefghhiíiiîjklĺľmnńňnoóôooöőpqrŕřsśštťuúuůüuuvwxyýzźž0123456789'; for (var k = 0; k < arr.length; k++) { var index = ''; for (var j = 0; j < arr[k][0].length; j++) { var i = chars.toUpperCase().indexOf(arr[k][0].substr(j,1).toUpperCase()) if (j+1 < arr[k][0].length) {if (arr[k][0].substr(j,1) == 'c' && arr[k][0].substr(j+1,1) == 'h') {i = 22;}} if (i < 10) {index = index+'0'+i;} else {index = index+i;} } out[k] = arr[k].concat(index); } return out; } |
||
Časová prodleva: 23 dní
|
|||
djluke Profil |
#18 · Zasláno: 30. 8. 2010, 10:53:21
Učesanější varianta, ještě se musí hlídat mezery mezi slovy. Ovšem přesně podle normy to není :).
var _chars = ' aáäaaâbcćčdďeéěëeefghhiíiiîjklĺľmnńňnoóôooöőpqrŕřsśštťuúuůüuuvwxyýzźž0123456789'.toUpperCase(); function czechSort(arr) { var map = {}; var index; for (var i = 0, item; i < arr.length; i++) { //pro každý prvek index = []; //reset indexu item = arr[i]; item.replace("/\s+/g", " "); for (var j = 0, ch, pos; j < item.length; j++) { ch = item.substr(j, 1).toUpperCase(); //test na ch if (j + 1 < item.length && ch == "C" && item.substr(j + 1, 1).toUpperCase() == "H") { pos = 22; //ch je na pozici 22 j++; } else { //zjistíme správnou pozici písmene pos = _chars.indexOf(ch); } index.push(pos < 10? "0" + pos : pos); //potřebujeme 0 prefix } //uložíme index prvku do mapy map[item] = index.join(""); } //nyní sortujeme podle nalezených indexů return arr.sort(function(a, b) { //získáme indexy var a2 = map[a]; var b2 = map[b]; if (a2 > b2) { return 1;} if (a2 < b2) { return -1;} return 0; }); } |
||
Časová prodleva: 14 let
|
0