stellatus
29.12.2019, 12:52:38
Mam taki skrypt:
Kod
<!DOCTYPE HTML>
<html>
<head>
<title> Sort a list alphabetically </title>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
</head>
<body>
<button> click here </button>
<ul>
<li>Geeks</li>
<li>Sosna</li>
<li>Zebra</li>
<li>GeeksForGeeks</li>
<li><h1>G</h1></li>
<li><h1>F</h1></li>
<li>Arbuz</li>
<li><h1>A</h1></li>
<li>Łódź</li>
<li><h1>Ł</h1></li>
<li>ósmy</li>
<li><h1>Ó</h1></li>
<li>święty</li>
<li><h1>Ś</h1></li>
<li>ärgern</li>
<li><h1>Ä</h1></li>
<li>Österreich</li>
<li><h1>Ö</h1></li>
<li>Überraschung</li>
<li><h1>Ü</h1></li>
</ul>
<script>
function Ascending_sort(a, b) {
return ($(b).text().toUpperCase()) <
($(a).text().toUpperCase()) ? 1 : -1;
}
$('button').on('click', function() {
$("ul li").sort(Ascending_sort).appendTo('ul');
});
</script>
</body>
</html>
Codepen:
https://codepen.io/rudolph-reti/pen/dyPzXERDopiero zacząłem uczyć się JavaScriptu. Myślę, że jeszcze sporo materiału musiałbym przerobić zanim sam poradziłbym sobie z tym, dlatego bardzo proszę o pomoc. Chciałbym, żeby lista była sortowana za pomocą funkcji
localeCompare(). Czy mógłby mi ktoś pomóc wpleść ją w ten kod?
nospor
30.12.2019, 11:31:26
No to zamiast
return ($(

.text().toUpperCase()) <
($(a).text().toUpperCase()) ? 1 : -1;
daj poprostu
return $(a).text().localeCompare($(

.text());
?
edit: te buzki to b zakonczone nawiasem
stellatus
1.01.2020, 14:50:52
Dzięki

Tutaj jest trochę zmodyfikowana wersja:
Kod
<!DOCTYPE HTML>
<html>
<head>
<title> Sort a list alphabetically </title>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js">
</script>
</head>
<body onload="finallListSort()">
<ul>
<li>Geeks</li>
<li>sosna</li>
<li>Zebra</li>
<li>GeeksForGeeks</li>
<li><h1>G</h1></li>
<li><h1>F</h1></li>
<li>Arbuz</li>
<li><h1>A</h1></li>
<li>Łódź</li>
<li><h1>Ł</h1></li>
<li>ósmy</li>
<li><h1>Ó</h1></li>
<li>święty</li>
<li><h1>Ś</h1></li>
<li>ärgern</li>
<li><h1>Ä</h1></li>
<li>Österreich</li>
<li><h1>Ö</h1></li>
<li>Überraschung</li>
<li>Ludzie</li>
<li><h1>Ü</h1></li>
<li><h1>L</h1></li>
<li><h1>S</h1></li>
<li>orka</li>
<li><h1>O</h1></li>
<li>ucho</li>
<li><h1>U</h1></li>
</ul>
<script>
function Ascending_sort(b, a) {
a = $(a).text().trim().toUpperCase();
b = $(b).text().trim().toUpperCase();
return b.localeCompare(a, 'de');
}
function finallListSort() {
$("ul li").sort(Ascending_sort).appendTo('ul')};
</script>
</body>
</html>
https://codepen.io/rudolph-reti/pen/dyPzXER Sortowanie dla języka polskiego działa poprawnie, ale dla niemieckiego nie. Wie ktoś dlaczego? Wszystkie umlauty (Ö, Ä, Ü) powinny iść na koniec listy, a stoją w miejscu.
stellatus
3.01.2020, 10:56:53
Mam Firefoxa 71, więc powinno działać.
nospor
3.01.2020, 11:04:36
Pisalem o dwoch potencjalnych problemach
stellatus
3.01.2020, 15:48:52
No tak, sorry. Chodzi o to, że "nie mam wgranych odpowiednich niemieckich definicji"? A co dokładnie masz na myśli?
nospor
3.01.2020, 15:52:37
No ze musisz dograc do systemu paczke z jezykiem niemieckim?
stellatus
3.01.2020, 22:07:42
Do jakiego systemu? Windowsa i Firefoxa mam już po niemiecku.
nospor
4.01.2020, 09:52:35
Kiepski ten twoj niemiecki w takim razie

Dobra, podaj jeszcze przyklad jakiegos sortowania co bym mial pewnosc ze mowimy o tym samym
stellatus
4.01.2020, 11:40:57
Nie rozumiem co masz na myśli mówiąc "przykład jakiegoś sortowania".
nospor
4.01.2020, 11:43:18
No podaj przyklad paru slow, w kolejnosci jaka chcesz by byly posortowane
stellatus
4.01.2020, 11:57:23
OK. Tak jak w poprzednich przykładach duże litery też miałyby być docelowo elementami list <ul> i nagłówkami <h3>.
Sposób 1 - tylko język niemiecki, litery Ä, Ö, Ü, ẞ powinny być na końcu: Z, Zecke, G, Geschäft, F, Friedrich, Affe, A, ärgern, Ä, Österreich, Ö, Überraschung, Leute, Ü, L, S, oft, O, Urlich, U, B, Bier, Fuß, film, groß, grom, müde, mur
Sposób 2 (słowa polskie i niemieckie, kolejność liter: A, Ą, Ä, B, C, Ć, D, E, Ę, F, G, H, I, J, K, L, Ł, M, N, Ń, O, Ó, Ö, P, R, S, Ś, ß, T, U, Ü, W, Y, Z, Ź, Ż: Z, złoto, Zecke, G, Geschäft, garnek, F, Friedrich, fajka, Affe, A, arbuz, ärgern, Ä, Österreich, Ö, Überraschung, Leute, ludzie, Ü, L, S, samochód, oft, O, oczy, Urlich, U, B, Bier, baba, Fuß, film, groß, grom, müde, mur
Kolega ze Stackoverflow próbował w ten sposób:
https://codepen.io/_Light/pen/vYEWYMy?editors=1010, ale jego skrypt nie działa. Założenie mi się jednak bardzo podoba, bo chciałbym dowolnie zmieniać kolejność liter przy sortowaniu.
nospor
4.01.2020, 12:34:13
Nie ogarniam tego co piszesz. Ewidentnie jestem za glupi
Najpierw piszesz, ze ma byc taka kolejnosc:
A, Ą, Ä, B, C, Ć, D, E, Ę, F, G, H, I, J, K, L, Ł, M, N, Ń, O, Ó, Ö, P, R, S, Ś, ß, T, U, Ü, W, Y, Z, Ź, Ż
a potem pokazujesz wyrazy w zupelnie innej kolejnosci
Z, złoto, Zecke, G, Geschäft, garnek, F, Friedrich, fajka, Affe, A, arbuz, ärgern, Ä, Österreich, Ö, Überraschung, Leute, ludzie, Ü, L, S, samochód, oft, O, oczy, Urlich, U, B, Bier, baba, Fuß, film, groß, grom, müde, mur
Wiec ja nie wiem ostatecznie co ty chcesz miec jako wynik koncowy
stellatus
4.01.2020, 13:04:53
To ja jestem głupi:) Sorry, napisałeś przecież wyraźnie: "podaj przyklad paru slow, w kolejnosci jaka chcesz by byly posortowane"
Sposób 1 - tylko język niemiecki, litery Ä, Ö, Ü, ẞ powinny być na końcu:
A, Affe, B, Bier, F, Friedrich, Fuß, G, Geschäft, groß, L, Leute, müde, O, oft, S, U, Urlich, Z, Zecke, Ä, ärgern, Ö, Österreich, Ü, Überraschung,
Sposób 2 (słowa polskie i niemieckie, kolejność liter: A, Ą, Ä, B, C, Ć, D, E, Ę, F, G, H, I, J, K, L, Ł, M, N, Ń, O, Ó, Ö, P, R, S, Ś, ß, T, U, Ü, W, Y, Z, Ź, Ż:
A, Affe, arbuz, Ä, ärgern, B, baba, Bier, F, fajka, film, Friedrich, fuga, Fuß, G, garnek, Geschäft, grom, groß, J, jaźń, L, Leute, ludzie, mur, müde, O, oczy, oft, Ö, Österreich, S, samochód, U, Urlich, Ü, Überraschung, Z, Zecke, złoto, Ż, żółć
nospor
4.01.2020, 17:26:02
No to drugi przyklad zalatwia ci w pelni localeCompare
A pierwszy przyklad, gdzie chcesz miec niemiecki literki na koncu to dodaj w funkcji sortujacej IFa na niemieckie literki dla nich zwracaj 1 czy tam -1 w zaleznosci jaka chcesz miec kolejnosc. Oczywiscie jak bedziesz mial do porownania dwie niemieckie literki to wtedy localeCompare bo je chcesz miec posortowane wzgledem siebie jak rozumiem
edit:
ale dobra, widze ze ta funkcja localeCompare faktycznie troche nedznie działa.
Bo jak masz ł i l to on poprawnie je ustawi, ale jak juz masz ł i lu to on twierdzi ze lu jest po ł. Ale nędza
edit2: aaa, dobra, tam sa jeszcze OPTIONS. Jak sie ustawi odpowiednie to fajnie juz dziala
return b.localeCompare(a,'pl',{sensitivity: 'accent'});
Teraz poprawnie leci z polskimi ł i lu
trueblue
4.01.2020, 17:36:30
Cytat(stellatus @ 4.01.2020, 11:57:23 )

Kolega ze Stackoverflow próbował w ten sposób:
https://codepen.io/_Light/pen/vYEWYMy?editors=1010, ale jego skrypt nie działa. Założenie mi się jednak bardzo podoba, bo chciałbym dowolnie zmieniać kolejność liter przy sortowaniu.
Bo nie używasz metody toLowerCase() na literze, a alfabet ma wyłącznie małe litery. Albo trzeba użyć tej metody, albo dodać do alfabetu wielkie litery (AaBbCc itd.).
stellatus
5.01.2020, 12:20:58
Nie wiedziałem gdzie tę metodę wprowadzić, więc dodałem duże litery:
https://codepen.io/rudolph-reti/pen/OJPzPqwSortowanie jest jednak dalej niepoprawne. Spójrz np. na literę F. Jest: "Friedrich, Fuß, Füchsin, fajka, film, fuga" a powinno być: "fajka, film, Friedrich, fuga, Fuß, Füchsin".
trueblue
5.01.2020, 12:27:19
Działa poprawnie. Wielkie litery w alfabecie mają priorytet, więc najpierw sortowane są wyrazy z wielkiej litery, potem te z małej.
Jeśli w alfabecie będą tylko małe litery, a użyjesz toLowerCase na literze, wtedy wielkość liter nie będzie mieć znaczenia.
stellatus
5.01.2020, 19:23:48
Dzięki! Działa, choć nie rozumiem jeszcze jak! Jestem Wam bardzo wdzięczny za pomoc
https://codepen.io/rudolph-reti/pen/OJPzPqwKod
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body onload="finallListSort()">
<ul>
<li>
<li>
<h3>F</h3>
</li>
<li>fajka</li>
<li>Füchsin</li>
<li>film</li>
<li>Friedrich</li>
<li>fuga</li>
<li>Fuß</li>
<li>
<h3>G</h3>
</li>
<li>gönnen</li>
<li>garnek</li>
<li>Geschäft</li>
<li>grom</li>
<li>groß</li>
<li>
<h3>J</h3>
</li>
<li>jaźń</li>
<li>Jänner</li>
<li>
<h3>L</h3>
</li>
<li>
<h3>S</h3>
</li>
<li>
<h3>B</h3>
</li>
<li>samochód</li>
<li>U</li>
<li>Urlich</li>
<li>
<h3>Ü</h3>
</li>
<li>Überraschung</li>
<li>
<h3>Z</h3>
</li>
<li>Zecke</li>
<li>złoto</li>
<li>
<h3>Ż</h3>
</li>
<li>żółć</li>
<li>Leute</li>
<li>Lüge</li>
<li>ludzie</li>
<li>
<h3>M</h3>
</li>
<li>mur</li>
<li>müde</li>
<li>
<h3>O</h3>
</li>
<li>oczy</li>
<li>oft</li>
<li>
<h3>Ö</h3>
</li>
<li>Österreich</li>
<h3>A</h3>
</li>
<li>Affe</li>
<li>arbuz</li>
<li>
<h3>Ä</h3>
</li>
<li>ärgern</li>
<li>aß</li>
<li>baba</li>
<li>Bier</li>
<li>Büro</li>
</ul>
</body>
Kod
const alphabet = "aäąbcćdeęfghijklłmnńoóöprsśßtuüwyzźż";
function letterSort(a, b) {
b = $(b).text().trim().toLowerCase();
a = $(a).text().trim().toLowerCase();
// Find the first position were the strings do not match
let position = 0;
while(a[position] === b[position]) {
// If both are the same don't swap
if(!a[position] && !b[position]) return 0;
// Otherwise the shorter one goes first
if(!a[position]) return 1;
if(!b[position]) return -1;
position++;
}
// Then sort by the characters position
return alphabet.indexOf(a[position]) - alphabet.indexOf(b[position]);
}
function finallListSort() {
$("ul li").sort(letterSort).appendTo('ul');
};