Sortuje elementy tablicy.
Metoda obiektu: Array
Parametry
- compareFunction -jest nazwą funkcji porównującej elementy. Jeżeli parametr zostanie pominięty, tablica będzie posortowana w porządku leksykograficznym (alfabetycznie).
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:
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:
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
Przykłady
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ą.
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
Listing
Ranga: Administrator serwisu Punktów: 0