Mam prosty obiekt JavaScript Array zawierający kilka liczb.
[267, 306, 108]
Czy istnieje funkcja, która znalazłaby największą liczbę w tej tablicy?
javascript
algorithm
arrays
max
rozsiany
źródło
źródło
Math.max(...[267, 306, 108]);
Odpowiedzi:
Resig na ratunek:
Ostrzeżenie : ponieważ maksymalna liczba argumentów jest tak mała jak 65535 na niektórych maszynach wirtualnych , użyj pętli for, jeśli nie masz pewności, że tablica jest tak mała.
źródło
apply
połączenia może to bardzo łatwo zmyć.RangeError: Maximum call stack size exceeded.
Możesz użyć funkcji Apply , aby wywołać Math.max :
Jak to działa?
zastosowanie służy do wywoływania innej funkcji z danym kontekstem i argumentami podanymi w postaci tablicy. Funkcje min i max mogą przyjmować dowolną liczbę argumentów wejściowych: Math.max (val1, val2, ..., valN)
Więc jeśli zadzwonimy:
Funkcja Apply wykona:
Zauważ, że pierwszy parametr, kontekst, nie jest ważny dla tych funkcji, ponieważ są one statyczne, będą działać niezależnie od tego, co zostanie przekazane jako kontekst.
źródło
Najłatwiejsza składnia z nowym operatorem rozkładania :
Źródło: Mozilla MDN
źródło
Nie jestem ekspertem od JS, ale chciałem zobaczyć, jak te metody się nakładają, więc była to dla mnie dobra praktyka. Nie wiem, czy jest to technicznie właściwy sposób na przetestowanie ich wydajności, ale po prostu uruchomiłem je jeden po drugim, jak widać w moim kodzie.
Sortowanie i uzyskiwanie wartości 0 jest zdecydowanie najgorszą metodą (i modyfikuje kolejność tablicy, co może nie być pożądane). Dla pozostałych różnica jest znikoma, chyba że mówimy o milionach wskaźników.
Średnie wyniki pięciu przebiegów z tablicą liczb losowych o wartości 100 000 indeksów:
źródło
jsperf tests
dla powyższegoPrzekonałem się, że w przypadku większych tablic (~ 100 000 elementów) opłaca się po prostu iterować tablicę skromną
for
pętlą, osiągając ~ 30% lepiej niżMath.max.apply()
:Wyniki testu
źródło
Możesz posortować tablicę w kolejności malejącej i uzyskać pierwszy element:
źródło
sort(function(a,b){return b-a;})
[...].sort().pop()
Co powiesz na to:
źródło
co powiesz na użycie Array.reduce ?
źródło
-Infinity
.Wykorzystują prawie wszystkie odpowiedzi
Math.max.apply()
co jest miłe i eleganckie, ale ma ograniczenia.Argumenty funkcji są umieszczane na stosie, który ma wadę - limit. Więc jeśli twoja tablica jest większa niż limit, nie powiedzie się
RangeError: Maximum call stack size exceeded.
Aby znaleźć rozmiar stosu wywołań, użyłem tego kodu:
Okazało się, że jest największy w FireFoxie na moim komputerze - 591519 . Oznacza to, że jeśli tablica zawiera więcej niż 591519 elementów,
Math.max.apply()
wystąpi błąd RangeError .Najlepszym rozwiązaniem tego problemu jest sposób iteracyjny (kredyt: https://developer.mozilla.org/ ):
O tym pytaniu pisałem tutaj na moim blogu .
źródło
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
źródło
Znalezienie wartości maksymalnej i minimalnej jest łatwe i ręczne. Ten kod jest znacznie szybszy niż
Math.max.apply
; Próbowałem do 1000 000 numerów w tablicy.źródło
findmax()
daje zły wynik, jeśli w tablicy są tylko liczby ujemne;findmin()
daje zły wynik dla pustej tablicy.Aby znaleźć największą liczbę w tablicy, której potrzebujesz tylko użyć
Math.max(...arrayName);
, działa to tak:Aby dowiedzieć się więcej na temat
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxźródło
Tak, oczywiście, istnieją:
Math.max.apply(null,[23,45,67,-45])
i wynik zwraca67
;źródło
Prosta jedna wkładka
źródło
Nie zapomnij, że można zrobić okład z
Function.prototype.bind
, co daje „all-native” funkcji .źródło
Możesz także rozszerzyć
Array
tę funkcję i uczynić ją częścią każdej tablicy.źródło
Możesz także użyć forEach :
źródło
Korzystanie -
Array.prototype.reduce()
jest fajne![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
gdzie acc = akumulator i val = aktualna wartość ;
źródło
Możesz spróbować
źródło
Właśnie zacząłem od JS, ale myślę, że ta metoda byłaby dobra:
źródło
array
zawiera tylko liczby ujemne.Znajdź największą liczbę w tablicy wielowymiarowej
źródło
var tmax = Math.max.apply(Math, max)
Lub jeszcze lepiej użyć zamknięcia funkcji pętli np. W stackoverflow.com/a/54980012/7438857 . Dzięki tej modyfikacji, to lepiej odpowiedziało na osobnym pytaniu, w jaki sposób „Znajdź największą liczbę w tablicy wielowymiarowej” lub na stackoverflow.com/questions/32616910/... . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Uruchom to:
A teraz spróbuj
[3,10,2].max()
wrócić10
źródło
Znajdź wartość Max i Min za pomocą Bubble Sort
źródło
Spróbuj tego
źródło
Zgodnie z komentarzem @ Quasimondo , który wydaje się być w dużej mierze pominięty, poniższe wyniki wydają się mieć najlepszą wydajność, jak pokazano tutaj: https://jsperf.com/finding-maximum-element-in-an-array . Należy zauważyć, że chociaż dla tablicy w pytaniu wydajność może nie mieć znaczącego wpływu, w przypadku dużych tablic wydajność staje się ważniejsza, i ponownie, jak zauważono, użycie
Math.max()
nawet nie działa, jeśli długość tablicy jest większa niż 65535. Zobacz także tę odpowiedź .źródło
Podejście rekurencyjne, jak to zrobić przy użyciu operatorów trójskładnikowych
źródło
for/of
Rozwiązanie z jedną pętlą:źródło