Ich habe ein einfaches JavaScript-Array-Objekt, das einige Zahlen enthält.
[267, 306, 108]
Gibt es eine Funktion, die die größte Zahl in diesem Array findet?
javascript
algorithm
arrays
max
dotty
quelle
quelle
Math.max(...[267, 306, 108]);
Antworten:
Resig zur Rettung:
Warnung : Da die maximale Anzahl von Argumenten auf einigen VMs nur 65535 beträgt , verwenden Sie eine for-Schleife, wenn Sie nicht sicher sind, ob das Array so klein ist.
quelle
apply
Anrufs dies sehr leicht auswaschen.RangeError: Maximum call stack size exceeded.
Mit der Apply- Funktion können Sie Math.max aufrufen :
Wie es funktioniert?
Die Apply- Funktion wird verwendet, um eine andere Funktion mit einem bestimmten Kontext und Argumenten aufzurufen, die als Array bereitgestellt werden. Die Funktionen min und max können eine beliebige Anzahl von Eingabeargumenten annehmen: Math.max (val1, val2, ..., valN)
Also, wenn wir anrufen:
Die Apply-Funktion wird ausgeführt:
Beachten Sie, dass der erste Parameter, der Kontext, für diese Funktionen nicht wichtig ist, da sie statisch sind und unabhängig davon funktionieren, was als Kontext übergeben wird.
quelle
Die einfachste Syntax mit dem neuen Spread-Operator :
Quelle: Mozilla MDN
quelle
Ich bin kein JS-Experte, aber ich wollte sehen, wie sich diese Methoden stapeln, daher war dies eine gute Praxis für mich. Ich weiß nicht, ob dies technisch der richtige Weg ist, um diese zu testen, aber ich habe sie einfach direkt nacheinander ausgeführt, wie Sie in meinem Code sehen können.
Das Sortieren und Abrufen des 0. Werts ist bei weitem die schlechteste Methode (und ändert die Reihenfolge Ihres Arrays, was möglicherweise nicht wünschenswert ist). Für die anderen ist der Unterschied vernachlässigbar, es sei denn, Sie sprechen von Millionen von Indizes.
Durchschnittliche Ergebnisse von fünf Läufen mit einem 100.000-Index-Array von Zufallszahlen:
quelle
jsperf tests
für die oben genannten gemachtIch habe festgestellt, dass es sich für größere Arrays (~ 100.000 Elemente) tatsächlich lohnt, das Array einfach mit einer bescheidenen
for
Schleife zu iterieren und eine um ~ 30% bessere Leistung zu erzielen alsMath.max.apply()
:Benchmark-Ergebnisse
quelle
Sie können das Array in absteigender Reihenfolge sortieren und das erste Element erhalten:
quelle
sort(function(a,b){return b-a;})
[...].sort().pop()
Wie wäre es damit:
quelle
Wie wäre es mit Array.reduce ?
quelle
-Infinity
.Fast alle Antworten verwenden,
Math.max.apply()
was nett und gut ist, aber Einschränkungen hat.Funktionsargumente werden auf einen Stapel gelegt, der einen Nachteil hat - eine Grenze. Wenn Ihr Array also größer als das Limit ist, schlägt es mit fehl
RangeError: Maximum call stack size exceeded.
Um eine Call-Stack-Größe zu finden, habe ich diesen Code verwendet:
Es erwies sich unter FireFox auf meinem Computer als das größte - 591519 . Wenn Ihr Array mehr als 591519 Elemente enthält,
Math.max.apply()
führt dies zu RangeError .Die beste Lösung für dieses Problem ist der iterative Weg (Kredit: https://developer.mozilla.org/ ):
Ich habe über diese Frage in meinem Blog hier geschrieben .
quelle
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
quelle
Das einfache und manuelle Finden von Max- und Min-Werten. Dieser Code ist viel schneller als
Math.max.apply
; Ich habe bis zu 1000k Zahlen im Array ausprobiert.quelle
findmax()
gibt das falsche Ergebnis aus, wenn das Array nur negative Zahlen enthält;findmin()
gibt das falsche Ergebnis für ein leeres Array aus.Um die größte Anzahl in einem Array zu finden, die Sie nur verwenden müssen
Math.max(...arrayName);
, funktioniert dies folgendermaßen:Weitere Informationen finden Sie unter
Math.max
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/maxquelle
Ja, natürlich gibt es:
Math.max.apply(null,[23,45,67,-45])
und das Ergebnis kehrt zurück67
;quelle
Einfacher Einzeiler
quelle
Vergessen Sie nicht, dass der Wrap durchgeführt werden kann
Function.prototype.bind
, sodass Sie eine "all-native" Funktion erhalten .quelle
Sie können
Array
diese Funktion auch erweitern und zu einem Teil jedes Arrays machen.quelle
Sie können auch forEach verwenden :
quelle
Verwenden -
Array.prototype.reduce()
ist cool![267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
wobei acc = Akkumulator und val = aktueller Wert ;
quelle
Sie können dies versuchen,
quelle
Ich habe gerade mit JS angefangen, aber ich denke, diese Methode wäre gut:
quelle
array
nur negative Zahlen enthalten sind.Suchen Sie die größte Zahl in einem mehrdimensionalen Array
quelle
var tmax = Math.max.apply(Math, max)
oder noch besser einen Verschluss einer Schleifenfunktion hinzufügen, z. B. in stackoverflow.com/a/54980012/7438857 . Mit dieser Änderung wird besser auf eine separate Frage geantwortet, wie Sie "die größte Zahl in einem mehrdimensionalen Array finden" oder unter stackoverflow.com/questions/32616910/… . WIP: jsfiddle.net/jamesray/3cLu9for/8 .Führen Sie Folgendes aus:
Und jetzt versuchen Sie es mit
[3,10,2].max()
Retouren10
quelle
Finden Sie den Max- und Min-Wert mit Bubble Sort
quelle
Versuche dies
quelle
Gemäß dem Kommentar von @ Quasimondo , der anscheinend weitgehend übersehen wurde, scheint das Folgende die beste Leistung zu haben, wie hier gezeigt: https://jsperf.com/finding-maximum-element-in-an-array . Beachten Sie, dass die Leistung für das betreffende Array möglicherweise keinen signifikanten Effekt hat, bei großen Arrays jedoch die Leistung an Bedeutung gewinnt. Wie bereits erwähnt ,
Math.max()
funktioniert die Verwendung nicht einmal, wenn die Array-Länge mehr als 65535 beträgt. Siehe auch diese Antwort .quelle
Ein rekursiver Ansatz zur Verwendung ternärer Operatoren
quelle
One-
for/of
Loop-Lösung:quelle