Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][JavaScript] sortowanie za pomocą localeCompare()
Forum PHP.pl > Forum > Przedszkole
stellatus
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/dyPzXER

Dopiero 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
No to zamiast
return ($(cool.gif.text().toUpperCase()) <
($(a).text().toUpperCase()) ? 1 : -1;

daj poprostu
return $(a).text().localeCompare($(cool.gif.text());
?

edit: te buzki to b zakonczone nawiasem
stellatus
Dzięki smile.gif 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.
nospor
U mnie sortuje prawidlowo wiec pewnie nie masz wgranych odpowiednich niemieckich definicji

ewentualnie sprawdz czy twoja przegladarka obsluguje drugi parametr
https://developer.mozilla.org/en-US/docs/We...r_compatibility
stellatus
Mam Firefoxa 71, więc powinno działać.
nospor
Pisalem o dwoch potencjalnych problemach
stellatus
No tak, sorry. Chodzi o to, że "nie mam wgranych odpowiednich niemieckich definicji"? A co dokładnie masz na myśli?
nospor
No ze musisz dograc do systemu paczke z jezykiem niemieckim?
stellatus
Do jakiego systemu? Windowsa i Firefoxa mam już po niemiecku.
nospor
Kiepski ten twoj niemiecki w takim razie wink.gif

Dobra, podaj jeszcze przyklad jakiegos sortowania co bym mial pewnosc ze mowimy o tym samym
stellatus
Nie rozumiem co masz na myśli mówiąc "przykład jakiegoś sortowania".
nospor
No podaj przyklad paru slow, w kolejnosci jaka chcesz by byly posortowane
stellatus
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
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
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
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
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
Nie wiedziałem gdzie tę metodę wprowadzić, więc dodałem duże litery: https://codepen.io/rudolph-reti/pen/OJPzPqw
Sortowanie 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
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
Dzięki! Działa, choć nie rozumiem jeszcze jak! Jestem Wam bardzo wdzięczny za pomoc guitar.gif

https://codepen.io/rudolph-reti/pen/OJPzPqw

Kod
<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');
};
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.