Finde das min / max Element eines Arrays in JavaScript
Wie kann ich leicht die min-oder max-element ein JavaScript-Array?
Beispiel Psuedocode:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
InformationsquelleAutor der Frage HankH | 2009-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie etwa die Erhöhung der built-in-Array-Objekt zu verwenden
Math.max
/Math.min
statt:Hier ist ein JSFiddle.
Ergänzung des built-ins können zu Kollisionen mit anderen Bibliotheken (manche sehen), so können Sie noch komfortabler mit nur
apply
'ingMath.xxx()
auf das array direkt:Abwechselnd, vorausgesetzt, Ihr browser unterstützt ECMAScript 6, die Sie verwenden können, die spread-operatordie Funktionen ähnlich zu der
apply
Methode:InformationsquelleAutor der Antwort Roatin Marth
Für eine vollständige Diskussion finden Sie unter:
http://aaroncrane.co.uk/2008/11/javascript_max_api/
InformationsquelleAutor der Antwort newspire
Für große arrays (~10⁷ Elemente),
Math.min
undMath.max
produziert den folgenden Fehler in Node.js.Eine stabilere Lösung ist, nicht fügen Sie jedes element, um den call-stack, sondern stattdessen ein array übergeben:
Wenn Sie sind besorgt über die Geschwindigkeit, der folgende code ist ~3 mal schneller dann
Math.max.apply
ist auf meinem computer. Sehen http://jsperf.com/min-and-max-in-array/2.Wenn Ihr arrays strings enthält, anstelle von zahlen müssen Sie auch zwingen, Sie zu zahlen. Der code unten tut, aber es verlangsamt den code unten ~10 mal auf meinem Rechner. Sehen http://jsperf.com/min-and-max-in-array/3.
InformationsquelleAutor der Antwort Linus Unnebäck
Wenn du paranoid bist wie ich, über die Verwendung von
Math.max.apply
(was Fehler verursachen könnte, wenn Sie angesichts von großen arrays nach MDN), versuchen Sie dies:Oder, in ES6:
Anonyme Funktionen sind leider notwendig (anstatt
Math.max.bind(Math)
weilreduce
nicht nur passa
undb
seiner Funktion, sondern auchi
und eine Referenz auf das array selbst, also müssen wir sicherstellen, dass wir nicht versuchen, zu nennenmax
auf diejenigen, die als gut.InformationsquelleAutor der Antwort Daniel Buckmaster
tl;dr
Offizielle
Math.max()
MDN-DokumentationInformationsquelleAutor der Antwort totymedli
.apply
wird oft verwendet, wenn die Absicht ist, die zum aufrufen einer variadischen Funktion mit einer Liste von argument-Werten, z.B.Den
Math.max([Wert1[,Wert2, ...]])
- Funktion gibt die größte von null oder mehr zahlen.Den
Math.max()
Methode ist es nicht möglich, ein array übergeben. Wenn Sie eine Liste von Werten, die Sie benötigen, um die größte, die man normalerweise rufen Sie diese Funktion mit Funktion.der Prototyp.anwenden()z.B.Jedoch, als der ECMAScript 6 können Sie die spread-operator:
Mithilfe der spread-operator, die oben geschrieben werden kann als Z:
Beim Aufruf einer Funktion mithilfe von variadic-operators können Sie auch weitere Werte hinzufügen, z.B.
Bonus:
Spread-operator können Sie verwenden Sie die array-literal-syntax zum anlegen neuer arrays in Situationen, in denen in ES5 Sie brauchen würde, um wieder fallen zu imperativen code, mit einer Kombination von
push
splice
usw.InformationsquelleAutor der Antwort Gajus
Tun Sie es durch erweitern der Array-Typ:
Angehoben von hier (von John Resig)
InformationsquelleAutor der Antwort inkedmn
Andere haben bereits einige Lösungen, in denen Sie sich vermehren
Array.prototype
. Allen möchte ich in dieser Antwort ist zu klären, ob es sein sollteMath.min.apply( Math, array )
oderMath.min.apply( null, array )
. So was Kontext verwendet werden sollte,Math
odernull
?Beim übergeben
null
als Kontext zuapply
dann der Rahmen wird standardmäßig auf das Globale Objekt (diewindow
Objekt, in dem Fall der Browser). Vorbei an derMath
Objekt als Kontext wäre die richtige Lösung, aber es wird nicht Schaden, übergebennull
. Hier ist ein Beispiel, wennnull
könnte Schwierigkeiten verursachen, wenn die Dekoration derMath.max
Funktion:Den oben genannten, wird eine Ausnahme ausgelöst, weil
this.foo
bewertetwindow.foo
dieundefined
. Wenn wir ersetzennull
mitMath
ist, werden die Dinge funktionieren wie erwartet, und der string "foo" wird gedruckt, auf dem Bildschirm (getestet habe ich diese mit Mozilla Rhino).Kann man so ziemlich davon ausgehen, dass niemand verziert
Math.max
so, vorbeinull
funktioniert ohne Probleme.InformationsquelleAutor der Antwort Ionuț G. Stan
Einer mehr Weg, es zu tun:
Verwendung:
InformationsquelleAutor der Antwort sbr
Ich bin überrascht, dass nicht ein mentiond die senken-Funktion.
InformationsquelleAutor der Antwort
Eine einfache Lösung zu finden, die den Minimalwert über eine
Array
von Elementen ist die Verwendung derArray
Prototyp-Funktionreduce
:oder mit JavaScript gebaut ist-in der Mathematik.Min () - Funktion (danke @Tenflex):
Diese Sätze
min
zuA[0]
und prüft dann fürA[1]...A[n]
ob es ist weniger streng als die aktuellemin
. WennA[i] < min
dannmin
aktualisiertA[i]
durch Rücksendung dieser Wert.InformationsquelleAutor der Antwort Nicolas Lykke Iversen
Für große arrays (~10⁷ Elemente),
Math.min
undMath.max
procuces eine RangeError (Maximum call stack size exceeded) in node.js.Für große arrays, eine quick & dirty Lösung ist:
InformationsquelleAutor der Antwort Peter
Kann dies für Ihre Zwecke anpassen.
InformationsquelleAutor der Antwort ChaosPandion
Ich hatte das gleiche problem, ich benötigt, um die minimalen und maximalen Werte eines Arrays und, zu meiner überraschung, es wurden keine integrierten Funktionen für arrays. Nach der Lektüre eine Menge, die ich beschlossen, zu testen die "top 3" - Lösungen mir:
Den test-code:
Das array war gefüllt mit 100.000 zufällige integer-zahlen, wird jede Funktion ausgeführt wurde 10.000 mal auf Mozilla Firefox 28.0 auf einem intel Pentium 4, 2.99 GHz desktop mit Windows Vista. Die Zeiten werden in Sekunden, abgerufen von der Leistung.jetzt () - Funktion. Die Ergebnisse wurden diese mit 3 Nachkommastellen und Standardabweichung:
REDUZIEREN die Lösung war 117% langsamer als die diskrete Lösung. Der APPLY-Lösung wurde das schlimmer, 2,118% langsamer als die diskrete Lösung. Außerdem, wie Peter beobachtet, es funktioniert nicht für große arrays (über mehr als 1.000.000 Elemente).
Auch für die Durchführung des tests, getestet habe ich diese extended discrete code:
Timing: Mittelwert=0.218 s, sd=0.094
So, es ist 35% langsamer als die einfache diskrete Lösung, aber es ruft sowohl die maximale und die minimale Werte auf einmal (jede andere Lösung würde mindestens zweimal,, um Sie abzuholen). Sobald die OP-Bedarf der Werte, die diskrete Lösung wäre die beste Wahl (auch als zwei getrennte Funktionen, die man für die Berechnung der maximalen und ein weiteres für die Berechnung der Mindest -, würden Sie besser abschneiden als der zweite am besten, die SENKEN-Lösung).
InformationsquelleAutor der Antwort Cyberknight
Können Sie die folgende Funktion irgendwo in Ihrem Projekt:
Dann können Sie rufen Sie die Funktionen übergeben Sie das array:
InformationsquelleAutor der Antwort Max Cabrera
Folgende code funktioniert bei mir :
InformationsquelleAutor der Antwort jaydip jadhav
Durchlaufen verfolgen, wie Sie gehen.
Dieser wird verlassen, min/max und null, wenn es keine Elemente in dem array. Wird für min und max in einem Durchgang, wenn das array hat keine Elemente.
Könnte man auch erweitern, Array mit einem
range
Methode mit den oben genannten zu ermöglichen Wiederverwendung und verbessern die Lesbarkeit. Finden Sie eine funktionierende Geige bei http://jsfiddle.net/9C9fU/Als
InformationsquelleAutor der Antwort tvanfosson
Einfache Sachen, wirklich.
InformationsquelleAutor der Antwort Brian
Hier ist ein Weg, wie man den max-Wert aus einem array von Objekten. Erstellen Sie eine Kopie (mit Scheibe), dann Sortieren Sie die Kopie in absteigender Reihenfolge, und schnappen Sie sich den ersten Punkt.
InformationsquelleAutor der Antwort Ben
Mit
Math.max()
oderMath.min()
Die folgende Funktion verwendet
Function.prototype.apply()
zu finden, die das maximale element in einem numerischen array.getMaxOfArray([1, 2, 3])
entsprichtMath.max(1, 2, 3)
aber Sie könnengetMaxOfArray()
auf programmgesteuert aufgebaut arrays jeder Größe.Oder mit dem neuen spread-operator ist, immer das maximum in einem array wird viel einfacher.
InformationsquelleAutor der Antwort shilovk
ChaosPandion ' s Lösung funktioniert, wenn Sie mit den protoypen. Wenn nicht, Bedenken Sie:
Oben zurück NaN wenn ein array-Wert ist keine ganze Zahl, so sollten Sie bauen einige Funktionen zu vermeiden. Sonst wird das funktionieren.
InformationsquelleAutor der Antwort jay
Wenn Sie prototype.js Rahmen, dann dieser code funktioniert ok:
Hier dokumentiert: Javascript prototype framework für max
InformationsquelleAutor der Antwort Prcela
Wenn Sie die Bibliothek verwenden sugar.jsschreiben Sie arr.min() und arr.max()wie Sie vorschlagen. Sie können auch min-und max-Werte von nicht-numerischen arrays.
Beispiele:
Bibliotheken, wie Lo-Dash und underscore.js bieten auch ähnlich leistungsstarke min-und max-Funktionen:
Beispiel von Lo-Dash:
InformationsquelleAutor der Antwort andersh
Zwei Wege sind kürzer und einfacher:
InformationsquelleAutor der Antwort Hafizur Rahman
InformationsquelleAutor der Antwort stevenlee
Ich mag Linus ist zu reduzieren ( - ) Ansatzvor allem für große arrays. Aber solange Sie wissen, Sie müssen beide min und max, warum die Iteration über das array zweimal?
Natürlich, wenn Sie lieber den iterativen Ansatz, die Sie tun können, zu:
InformationsquelleAutor der Antwort fearless_fool
erstellen Sie ein einfaches Objekt
InformationsquelleAutor der Antwort Yene Mulatu