Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][JavaScript] sortowanie za pomocą localeCompare()
stellatus
post 29.12.2019, 12:52:38
Post #1





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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?

Ten post edytował stellatus 29.12.2019, 12:55:43
Go to the top of the page
+Quote Post
nospor
post 30.12.2019, 11:31:26
Post #2





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 1.01.2020, 14:50:52
Post #3





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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.

Ten post edytował stellatus 1.01.2020, 14:54:27
Go to the top of the page
+Quote Post
nospor
post 2.01.2020, 12:04:21
Post #4





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 3.01.2020, 10:56:53
Post #5





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


Mam Firefoxa 71, więc powinno działać.
Go to the top of the page
+Quote Post
nospor
post 3.01.2020, 11:04:36
Post #6





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




Pisalem o dwoch potencjalnych problemach


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 3.01.2020, 15:48:52
Post #7





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


No tak, sorry. Chodzi o to, że "nie mam wgranych odpowiednich niemieckich definicji"? A co dokładnie masz na myśli?
Go to the top of the page
+Quote Post
nospor
post 3.01.2020, 15:52:37
Post #8





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




No ze musisz dograc do systemu paczke z jezykiem niemieckim?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 3.01.2020, 22:07:42
Post #9





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


Do jakiego systemu? Windowsa i Firefoxa mam już po niemiecku.
Go to the top of the page
+Quote Post
nospor
post 4.01.2020, 09:52:35
Post #10





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




Kiepski ten twoj niemiecki w takim razie wink.gif

Dobra, podaj jeszcze przyklad jakiegos sortowania co bym mial pewnosc ze mowimy o tym samym


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 4.01.2020, 11:40:57
Post #11





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


Nie rozumiem co masz na myśli mówiąc "przykład jakiegoś sortowania".
Go to the top of the page
+Quote Post
nospor
post 4.01.2020, 11:43:18
Post #12





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




No podaj przyklad paru slow, w kolejnosci jaka chcesz by byly posortowane


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 4.01.2020, 11:57:23
Post #13





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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.

Ten post edytował stellatus 4.01.2020, 12:14:14
Go to the top of the page
+Quote Post
nospor
post 4.01.2020, 12:34:13
Post #14





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stellatus
post 4.01.2020, 13:04:53
Post #15





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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, Ż, żółć

Ten post edytował stellatus 4.01.2020, 14:23:28
Go to the top of the page
+Quote Post
nospor
post 4.01.2020, 17:26:02
Post #16





Grupa: Moderatorzy
Postów: 36 442
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 4.01.2020, 17:36:30
Post #17





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.).


--------------------
Go to the top of the page
+Quote Post
stellatus
post 5.01.2020, 12:20:58
Post #18





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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".
Go to the top of the page
+Quote Post
trueblue
post 5.01.2020, 12:27:19
Post #19





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
stellatus
post 5.01.2020, 19:23:48
Post #20





Grupa: Zarejestrowani
Postów: 196
Pomógł: 0
Dołączył: 9.03.2017

Ostrzeżenie: (0%)
-----


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');
};


Ten post edytował stellatus 5.01.2020, 19:29:14
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 08:34