21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
vacjos
Profil *
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
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
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 *
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
http://interval.cz/clanky/serazeni-tabulky-javascriptem-snadno-a-rychl e/

Leo
los
Profil *
data.sort(function(a, b) { return a[0].localeCompare(b[0]); });
vacjos
Profil *
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
Opera je s odpustenim prohlizec na dve veci, jakmile dojde na js, Leo
peta
Profil
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
"Je mozne, ze funkci localeCompare nema"

Ma, zna ji, ale neserazuje cesky, Leo
los
Profil *
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 *
Ešte toto: return a.length != b.length ? a.length - b.length : 0;
by šlo zapísať rovno takto: return a.length - b.length;
kabanos
Profil *
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 *
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 *
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 *
Přijde mi, že to neumí dát ch za h.
kabanos
Profil *
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;
}
djluke
Profil
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;
	});
}

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0