Visit Mozilla.org

Dokumentacja języka JavaScript 1.5:Obiekty:Array:sort

z Mozilla Developer Center, polskiego centrum programistów Mozilli.

UWAGA: Tłumaczenie tej strony nie zostało zakończone.
Może być ona niekompletna lub wymagać korekty.
Chcesz pomóc? | Dokończ tłumaczenie | Sprawdź ortografię | Więcej takich stron...

Spis treści

[edytuj] Podsumowanie

Sortuje elementy tablicy.

Metoda obiektu: Array
Zaimplementowana w: JavaScript 1.1, NES 2.0

JavaScript 1.2: zmienione zachowanie.

Wersja ECMA: ECMA-262

[edytuj] Składnia

sort(compareFunction)

[edytuj] Parametry

compareFunction 
jest nazwą funkcji porównującej elementy. Jeżeli parametr zostanie pominięty, tablica będzie posortowana w porządku leksykograficznym (alfabetycznie).

[edytuj] Opis

Jeżeli compareFunction nie zostanie podana, elementy zostaną posortowane leksykograficznie (alfabetycznie - słownikowo) według porównania ich reprezentacji znakowej (łańcucha znaków). Przykładowo "80" znajdzie się przed "9" w porządku leksykograficznym, pomimo że numerycznie 9 poprzedza 80.

Jeżeli compareFunction zostanie podana, elementy tablicy zostaną posortowane odpowiednio do wartości zwracanej przez funkcję porównującą. Jeżeli a oraz b są dwoma porównywanymi elementami tablicy to:

  • compareFunction(a, b) zwróci wartość mniejszą od 0 - indeks elementu b będzie mniejszy niż indeks a (logicznie b < a).
  • compareFunction(a, b) zwróci 0 - pozostawia a oraz b w niezmienionej kolejności względem siebie, jednak w dalszym ciągu oba będą porównywane z innymi elementami (logicznie b = a). Uwaga: Standard ECMAscript nie gwarantuje niezmienionej kolejności (np. Mozilla wszystkie wersje do 2003 roku).
  • compareFunction(a, b) zwraca wartość większą od 0 - indeks elementu b będzie większy niż indeks a (logicznie b > a).

Ogólna postać funkcji porównującej wygląda następująco:

function compare(a, b) {
   if (a mniejsze niż b wg. kryteriów sortowania)
      return -1
   if (a większe od b wg. kryteriów sortowania)
      return 1
   // a równe b
   return 0
}

W celu porównania liczb, zamiast napisów, funkcja porównująca może odejmować b od a:

function compareNumbers(a, b) {
   return a - b
}

Niektóre implementacje JavaScript wykonują sortowanie stabilne: kolejność elementów a i b nie jest zmieniana jeśli a i b są sobie równe. Jeżeli przed sortowaniem a jest w tablicy wcześniej niż b oraz a i b są sobie równe, to po sortowaniu ich kolejność będzie taka sama (niezależnie od tego, jak zmienią się pozycje elementów a i b).

W SpiderMonkey oraz wszystkich przeglądarkach opartych o Mozillę sortowanie nie jest stabilne. Błąd błąd 224128 opisuje postęp wprowadzania sortowania stabilnego.

Zachowanie metody sort zmieniono pomiędzy JavaScript 1.1 i JavaScript 1.2.

W JavaScript 1.1, na niektórych platformach metoda sort nie działała. Metoda ta działa na wszystkich platformach dla JavaScript 1.2.

W JavaScript 1.2, metoda ta nie konwertuje już niezdefiniowanych elementów do wartości null; zamiast tego przenosi je na sam koniec tablicy. Na przykład następujący skrypt:

<SCRIPT>
a = new Array();
a[0] = "Ant";
a[5] = "Zebra";

function writeArray(x) {
   for (i = 0; i < x.length; i++) {
      document.write(x[i]);
      if (i < x.length-1) document.write(", ");
   }
}

writeArray(a);
a.sort();
document.write("<BR><BR>");
writeArray(a);
</SCRIPT>

W JavaScript 1.1, JavaScript wypisze:

ant, null, null, null, null, zebra
ant, null, null, null, null, zebra

W JavaScript 1.2, JavaScript wypisze:

ant, undefined, undefined, undefined, undefined, zebra
ant, zebra, undefined, undefined, undefined, undefined

[edytuj] Przykłady

[edytuj] Przykład: Tworzenie, wyświetlanie i sortowanie tablic

Następujący przykład tworzy cztery tablice i wyświetla oryginalną tablicę, potem posortowane tablice. Tablice liczbowe są sortowane najpierw bez podania funkcji porównującej, następnie z taką funkcją.

<SCRIPT>
stringArray = new Array("Blue","Humpback","Beluga")
numericStringArray = new Array("80","9","700")
numberArray = new Array(40,1,5,200)
mixedNumericArray = new Array("80","9","700",40,1,5,200)

function compareNumbers(a, b) {
   return a - b
}

document.write("tablicaNapisów: " + stringArray.join() +"<BR>")
document.write("Posortowana: " + stringArray.sort() +"<P>")

document.write("tablicaLiczbowa: " + numberArray.join() +"<BR>")
document.write("Posortowana bez funkcji porównującej: " + numberArray.sort() +"<BR>")
document.write("Posortowana z funkcją porównującą: " + numberArray.sort(compareNumbers) +"<P>")

document.write("tablicaNapisówLiczbowych: " + numericStringArray.join() +"<BR>")
document.write("Posortowana bez funkcji porównującej: " + numericStringArray.sort() +"<BR>")
document.write("Posortowana z funkcją porównującą: " + numericStringArray.sort(compareNumbers) +"<P>")

document.write("tablicaLiczbowaMieszna: " + mixedNumericArray.join() +"<BR>")
document.write("Posortowana bez funkcji porównującej: " + mixedNumericArray.sort() +"<BR>")
document.write("Posortowana z funkcją porównującą: " + mixedNumericArray.sort(compareNumbers) +"<BR>")
</SCRIPT>

Ten przykład wyświetla następujące dane. Jak widać, przy zastosowaniu funkcji porównującej, liczby są sortowane prawidłowo niezależnie od tego czy są przedstawiane jako wartości liczbowe bądź też napisy.

tablicaNapisów: Blue,Humpback,Beluga
Posortowana: Beluga,Blue,Humpback

tablicaLiczbowa: 40,1,5,200
Posortowana bez funkcji porównującej: 1,200,40,5
Posortowana z funkcją porównującą: 1,5,40,200

tablicaNapisówLiczbowych: 80,9,700
Posortowana bez funkcji porównującej: 700,80,9
Posortowana z funkcją porównującą: 9,80,700

tablicaLiczbowaMieszna: 80,9,700,40,1,5,200
Posortowana bez funkcji porównującej: 1,200,40,5,700,80,9
Posortowana z funkcją porównującą: 1,5,9,40,80,200,700

[edytuj] Zobacz także

join, reverse