2012-03-22 16 views
9

JavaScript sort function which takes a parameter pozwala na przekazanie funkcji.Jak działa funkcja sortowania JavaScript (jako algorytm)?

Na przykład:

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

Jak to jest, że kod

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

jest interpretowany być rosnąco? To powinno być podzielone na trzy przypadki, < 0, i > 0, ale jak to ma sens, gdy a i b może być cokolwiek?

Dziękujemy!

+0

duplikat: http: //stackoverflow.com/questions/1494713/how-does-javascripts-sortworkwork – alishaukat

Odpowiedz

6

Powód odpowiadający na pytanie jest szczególnie trudny, a przynajmniej w szczegółach, ponieważ nie ma specyfikacji określającej algorytm sortowania, jaki powinna zaimplementować przeglądarka. Dokładne wyjaśnienie, w jaki sposób działa ona w jednej przeglądarce, może się różnić w zależności od przeglądarki, a nawet zmieniać się w czasie.

Najważniejsze jest to, że chcesz myśleć o "a" i "b" jako o dowolnych dwóch wartościach. Jeśli zwracasz wynik "a" - "b", oznacza to, że sortowanie odbywa się w kolejności rosnącej. Jeśli robisz "b" - "a", to jest w malejącej kolejności.

Zgrabne narzędzie do tworzenia własnych funkcji sortowania polega na porównaniu wartości "a" i "b" po przetworzeniu ich w oddzielnej funkcji. Powiedzmy więc, że chcesz sortować według wartości Celsjusza, ale twoja tablica tylko w Fahrenheita. Możesz zrobić coś takiego:

.sort(function(a,b){ return to_fahrenheit(a) - to_fahrenheit(b);} 
+0

To naprawdę fajne, jak utworzyć niestandardową funkcję sortowania! Dziękuję Ci ! – Coffee

+0

@sch - Wielkie dzięki, zapamiętam to dobrze teraz! Jesteście najlepsi! – Coffee

+0

sortuje farenheita inaczej niż w Celsjuszu? farenheit ma przesuniętą skalę z innym współczynnikiem, ale sortowanie jest równe. –

2

To dlatego, że jeśli b jest większy niż a, będzie mniejszy niż 0. Jeśli a == b, zwróci 0. W przeciwnym razie będzie to liczba dodatnia.

+0

Przebiega przez każdą parę cyfr i czeków? – Coffee

+1

zależy to od sposobu implementacji 'sort'. –

+0

Hmm Widzę, OK, to jest wyraźniejsze. dzięki! – Coffee

1

Jest to łatwiejsze do zrozumienia na przykładzie. Przeanalizujmy każdy możliwy przypadek:

  1. Niech a = 10 i b = 20. Tak więc a - b jest -10, a zgodnie z konwencją zwracamy wartość ujemną, jeśli a < b, więc jesteśmy dobrzy.
  2. Niech a = 20 i b = 10. Tak więc a - b jest 10 i zgodnie z konwencją zwracamy wartość dodatnią, jeśli a > b, więc nadal jesteśmy dobrzy.
  3. Niech a = 10 i b = 10. Tak więc a - b jest 0, a zgodnie z konwencją zwracamy 0 jeśli a == b, a wszystko działa zgodnie z oczekiwaniami!

Ogólnie: jeśli a < b, a - b będzie zawsze ujemny; jeśli a > b, a - b będzie zawsze dodatnia; i jeśli a == b, a - b zawsze będzie 0, tak długo jak a i b są wartościami całkowitymi.

+0

Wielkie dzięki, Oscar! kliknął! – Coffee

5

Funkcja sort będzie wielokrotnie wywoływała funkcję compareFunction i przechodzi do pozycji a i . Stanie się to wiele razy, dopóki tablica nie zostanie posortowana.

porównać funkcja powinna powrócić:

  • 0 jeśli a == b;
  • dodatnia liczba jeśli a > b;
  • liczba ujemna, jeśli b < a.

Teraz rzućmy okiem na funkcję w kodzie, mamy a - b =:

  • 0 jeśli a == b;
  • dodatnia liczba jeśli a > b;
  • liczba ujemna, jeśli b < a.

W ten sposób zwraca oczekiwany wynik, a tablica zostanie posortowana poprawnie.

Aby uzyskać więcej informacji, spójrz na numer documentation.

+0

Dziękuję bardzo, sch. Rozumiem to teraz i przeczytałem również odnośnik, bardzo dokładny! – Coffee

+0

Wielkie dzięki, zapamiętam to dobrze teraz! Jesteście najlepsi! – Coffee

2

Funkcja przyjmuje 2 parametry (a, b). Ta funkcja odejmuje a od b i zwraca wynik. Jeśli wartość zwracana jest
Positive - a jest liczbą większą niż b
Negative - a jest liczbą mniejszą niż b
Zero - a jest równe b

zachowanie różni się w zależności od używanej przeglądarki: Zobacz dane wyjściowe wygenerowane przez różne przeglądarki:

var numArray = [20,1,10,2,3]; 
numArray.sort(function(a,b) { 
    document.write("a = " + a + ", b = " + b + "<br />"); 
    return a-b} 
); 

output on firefox : 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 2, b = 3 
a = 20, b = 2 
a = 1, b = 2 
a = 10, b = 2 
a = 10, b = 3 


output on chrome: 
a = 20, b = 1 
a = 20, b = 10 
a = 1, b = 10 
a = 20, b = 2 
a = 10, b = 2 
a = 1, b = 2 
a = 20, b = 3 
a = 10, b = 3 
a = 2, b = 3 

Mam nadzieję, że to pomoże!

3
var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){return a - b}) //Array now becomes [7, 8, 25, 41] 

po prostu zmienić na

var myarray=[25, 8, 7, 41] 
myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41] 

po próbie powyższy kod w konsoli dziennika będzie można zobaczyć następujący wynik

var myarray=[25, 8, 7, 41] 
 
    myarray.sort(function(a,b){console.log("comparing " + a + ", " + b);return a - b}) //Array now becomes [7, 8, 25, 41]

IS interp Reted być rosnąco? Powinien być podzielony na trzy przypadki: < 0, == 0 i> 0; ale jak to ma sens, kiedy aib może być cokolwiek?

pierwsze porównanie: 25,8

Teraz, pozwala odpowiedzieć na wątpliwości w jaki sposób wybiera wartość a, b.Po uruchomieniu kodu widać pierwsze porównanie pomiędzy 25,8, a jeśli wynik jest dodatni, oznacza to, że 8 jest mniejsze. Więc po prostu re-order to do 8, 25.

drugie porównanie: 25,7

Następnie dokonywane jest porównanie pomiędzy 25, 7 i to dlatego, że jeśli wynik jest ujemny, a następnie numer trzeci zostanie oddany po 25 i sortowaniu trzech liczb zostanie zrobione.

Ale sprawa jest inna, teraz, gdy wynik ponownie jest pozytywny. Tablica ponownie zamienia się na po tym czasie ponownie wykonuje test, dopóki nie stwierdzi, że warunek jest dodatni. Teraz porównuje 8, 7, a wynik znów jest ujemny.

tablicy ponownie re-zlecenia się do

7, 8, 25 

TRZECI porównania: 25, 41

Teraz, w tej ostatniej porównania, wynik jest jako pozytywny, co oznacza, że ​​41 jest większa niż 25 .

więc tablica przestawia się do

7,8,25,41 
0
var a = [5,2,1,3,9,6]; 

console.log(a.sort(function(a,b){console.log(a+"," +b); return a>b;})); 

Result: 
5,2 => create array [2,5] 
5,1 => need to check 2 and 1. [2,5], [1,5] 
2,1 => push 1 before 2? isOk? => OK [1,2,5] 
5,3 => need to check 1,2 with 3 before 5 [1,2,5], [3,5] 
2,3 => push 3 after 2 and before 5 => OK [1,2,3,5] 
5,9 => [1,2,3,5,9] 
9,6 => [1,2,3,5,9], [6,9] 
5,6 => [1,2,3,5,6,9]