Próba uzyskania najwyższej i najniższej wartości z tablicy, która, jak wiem, będzie zawierać tylko liczby całkowite, wydaje się trudniejsza niż myślałem.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Spodziewałbym się tego 99, 104, 140000
. Zamiast tego pokazuje 104, 140000, 99
. Wygląda więc na to, że sort obsługuje wartości jako ciągi znaków.
Czy istnieje sposób, aby funkcja sortowania faktycznie sortowała według wartości liczb całkowitych?
javascript
arrays
sorting
numbers
peirix
źródło
źródło
NaN
. Byłoby miło zobaczyć wysoko ocenianą odpowiedź, która dotyczyNaN
.Odpowiedzi:
Domyślnie metoda sortowania sortuje elementy alfabetycznie. Aby posortować numerycznie, po prostu dodaj nową metodę, która obsługuje sortowanie numeryczne (sortNumber, pokazano poniżej) -
W ES6 możesz to uprościć za pomocą funkcji strzałek:
Dokumentacja:
Mozilla
Array.prototype.sort()
zaleca tę funkcję porównywania dla tablic, które nie zawierają Infinity ani NaN. (PonieważInf - Inf
jest NaN, a nie 0).Również przykłady sortowania obiektów według klucza.
źródło
numberArray.sort((a, b) => (a - b));
Tak! Myślę, że jest to bliskie out-of-the-box sposób. Uwaga: sprawdź, czy silnik JS obsługuje funkcje strzałek.Opierając się na wszystkich powyższych odpowiedziach, można je również wykonać w jednym wierszu:
źródło
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Lub bardziej kompaktowy, w ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
ireturn
, ale tak naprawdę nie używasz prawdziwego celu przejścia przez funkcję strzałkithis
. Ten kod sugeruje, że zdarza się pewnethis
przekazywanie kontekstu, ale tak nie jest. Mylące dla innych programistów, aby odczytać twój kod, tylko po to, aby zapisać kilka znaków. Nie polegaj na skutkach ubocznych - koduj celowo!this
do funkcji, ale to nieprawda. W rzeczywistości zaniedbuje się tworzenie zmiennejthis
i oraz,arguments
która zwykle zastępuje zmienne nadrzędne. Jedynym powodem, dla którego można użyćthis
funkcji strzałki, jest zakres leksykalny.array.sort domyślnie wykonuje sortowanie leksykograficzne, dla sortowania numerycznego podaj własną funkcję. Oto prosty przykład:
Pamiętaj też, że sortowanie działa „na miejscu”, nie ma potrzeby przypisywania.
źródło
Ta odpowiedź jest równoważna z niektórymi istniejącymi odpowiedziami, ale funkcje strzałek ECMAScript 6 zapewniają znacznie bardziej kompaktową składnię, która pozwala nam zdefiniować wbudowaną funkcję sortowania bez poświęcania czytelności:
Jest obecnie obsługiwany w większości przeglądarek .
źródło
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
a jeśli właściwość jest ciągiem, możesz:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
To powiedziawszy, to pytanie konkretnie dotyczy sortowania tablicy liczb całkowitychJestem zaskoczony, dlaczego wszyscy zalecają przekazanie funkcji porównawczej
sort()
, która sprawia, że sortowanie jest naprawdę wolne!Aby posortować liczby, po prostu utwórz dowolny TypedArray :
źródło
Powód, dla którego funkcja sortowania zachowuje się tak dziwnie
Z dokumentacji :
Jeśli wydrukujesz wartości punktu Unicode tablicy, to się wyczyści.
Zwraca: „49, 49, 57”.
Teraz, ponieważ 140000 i 104 zwróciły te same wartości (49), odcina pierwszy indeks i sprawdza ponownie:
Jeśli to posortujemy, otrzymamy:
więc 104 występuje przed 140000.
Tak więc końcowy wynik będzie:
104, 140000, 99
Wniosek:
sort()
sortuje, patrząc tylko na pierwszy indeks liczb.sort()
nie dba o to, czy liczba całkowita jest większa od innej, porównuje wartość Unicode cyfr, a jeśli istnieją dwie równe wartości Unicode, sprawdza, czy jest następna cyfra, i porównuje ją.Aby sortować poprawnie, musisz przekazać funkcję porównania,
sort()
tak jak to wyjaśniono tutaj .źródło
Zgadzam się z aks, jednak zamiast używać
Powinieneś użyć
źródło
>
I<
nadal porównać A i B ciągów.W nowym świecie ES6 łatwiej jest coś takiego zrobić
To wszystko czego potrzebujesz :)
źródło
W JavaScript domyślnym zachowaniem metody sort () jest sortowanie wartości w tablicy alfabetycznie.
Aby posortować według numeru, musisz zdefiniować funkcję sortowania numerycznego (co jest bardzo łatwe):
źródło
Array.prototype.sort () to metoda sortowania tablic, ale należy pamiętać o kilku kwestiach.
Kolejność sortowania jest domyślnie leksykograficzna, a nie numeryczna, niezależnie od typów wartości w tablicy. Nawet jeśli tablica zawiera wszystkie liczby, wszystkie wartości zostaną przekonwertowane na ciąg i posortowane leksykograficznie.
Powinniśmy więc dostosować metodę sort () i reverse () jak poniżej.
Polecony adres URL
Do sortowania liczb w tablicy
Do cofania liczb w tablicy
Polecony adres URL
źródło
Na pytanie już udzielono odpowiedzi, najkrótszą metodą jest użycie
sort()
metody. Ale jeśli szukasz więcej sposobów na posortowanie tablicy liczb i lubisz cykle, sprawdź poniższeSortowanie przez wstawianie
Rosnąco:
Malejąco:
Sortuj wybór:
Rosnąco:
Malejąco:
baw się dobrze
źródło
sort()
na TypedArray, jak sugeruje ta odpowiedź . Z pewnością nie będą one szybsze dla średnich i dużych tablic, ponieważ są to algorytmy O (n ^ 2).Funkcja „numerycznie” poniżej służy do sortowania tablic liczb w wielu przypadkach, gdy jest udostępniana jako funkcja zwrotna:
Ale w niektórych rzadkich przypadkach, gdy tablica zawiera bardzo duże i ujemne liczby, może wystąpić błąd przepełnienia, ponieważ wynik ab staje się mniejszy niż najmniejsza liczba, z którą JavaScript może sobie poradzić.
Tak więc lepszy sposób pisania funkcji numerycznej jest następujący:
źródło
DBL_MIN - DBL_MAX
), ale niedopełnienie nie jest możliwe. Katastrofalne anulowanie powoduje, że wynik jest nieprecyzyjny, tracąc większość „znaczących cyfr”, alea-b
zawsze będzie niezerowy i będzie miał odpowiedni znak dla a! = B.do obsługi niezdefiniowanych, zerowych i NaN: Null zachowuje się jak 0, NaN i niezdefiniowane kończy się.
źródło
Tylko dla normalnej tablicy wartości elementów:
W przypadku tablicy obiektów:
źródło
Moja osobista ulubiona forma tej funkcji pozwala na określenie parametru Rosnąco lub Malejąco:
Użycie tak proste jak:
jsFiddle
Lub przykładowy fragment kodu tutaj!
.smartSort („asc” | „desc”)
Teraz baw się jeszcze lepiej dzięki metodzie sortowania, która sortuje tablicę pełną wielu przedmiotów! Obecnie nie obejmuje „asocjacyjnego” (aka, ciągów znaków), ale obejmuje wszystkie wartości! Nie tylko posortuje wiele wartości
asc
lubdesc
odpowiednio, ale także utrzyma stałą „pozycję” „grup” wartości. Innymi słowy; ints są zawsze pierwsze, potem łańcuchy, potem tablice (tak, robię to wielowymiarowe!), następnie Obiekty (niefiltrowane, element, data), a na koniec niezdefiniowane i zerowe!"Dlaczego?" ty pytasz. Dlaczego nie!
Teraz występuje w 2 smakach! Pierwsza z nich wymaga nowszych przeglądarek, ponieważ używa
Object.defineProperty
metody dodawania metody doArray.protoype
obiektu. Pozwala to na łatwość naturalnego użytkowania, takich jak:myArray.smartSort('a')
. Jeśli chcesz zaimplementować starsze przeglądarki lub po prostu nie lubisz modyfikować obiektów natywnych, przewiń w dół do wersji Tylko metoda .jsFiddle Array.prototype.smartSort ('asc | desc')
Użycie jest proste! Najpierw utwórz szaloną tablicę, taką jak:
Następnie posortuj to!
Tylko metoda
Taki sam jak poprzedni, tyle że tylko prosta metoda!
Posługiwać się:
jsFiddle Method smartSort (Array, „asc | desc”)
źródło
Wypróbuj ten kod:
HTML:
Kod JavaScript:
źródło
Wypróbuj ten kod jak poniżej
źródło
źródło
Chociaż nie jest to wymagane w JavaScript, jeśli chcesz ściśle zwracać -1, 0 lub 1 (podobnie jak operator statku kosmicznego w PHP), możesz użyć .
sort()
compareFunction
Math.sign()
compareFunction
Poniżej ściśle zwraca -1, 0, lub 1:źródło
To jest już zaproponowane i zaakceptowane rozwiązanie jako metoda na prototypie Array:
źródło
Metoda sortowania konwertuje elementy tablicy na ciąg znaków. Tak więc poniżej sposób działa również dobrze z liczbami dziesiętnymi z elementami tablicy.
I daje oczekiwany wynik.
źródło
Przesłanianie metody sortowania.
źródło
Domyślną funkcją sortowania jest sortowanie w kolejności słownikowej:
Powyższy nie dotyczy liczb. Więc jeśli masz liczby całkowite i domyślna funkcja sortowania nie działa (ponieważ sortuje w kolejności słownikowej), musisz zaimplementować własną funkcję:
Mam nadzieję, że masz na uwadze pytanie, jak to działa? Tutaj, gdy zapewniamy metodę w funkcji sortowania, przekazuje dwie liczby za każdym razem i jeśli liczba zwraca
Postępując zgodnie z tym dla wszystkich liczb, sortuje tablicę liczb całkowitych.
Jeśli używasz ES6, napisz funkcję strzałki:
źródło
Oto moja funkcja tablicy sortowania w bibliotece utils:
źródło
a-b
należy zamiast tego użyć. (Możesz się przyzwyczaić i zrobićNumber(a>b)-0.5
, ale to wciąż nie jest stabilny rodzaj).