Ich habe das:
var arr = [0, 21, 22, 7];
Wie kann der Index des höchsten Werts am besten in eine andere Variable zurückgegeben werden?
javascript
arrays
max
Stephen
quelle
quelle
Antworten:
Dies ist wahrscheinlich der beste Weg, da es zuverlässig ist und mit alten Browsern funktioniert:
Es gibt auch diesen Einzeiler:
Es führt doppelt so viele Vergleiche wie nötig durch und wirft jedoch
RangeError
große Arrays auf. Ich würde mich an die Funktion halten.quelle
const max = arr.reduce((m, n) => Math.max(m, n))
, dann sind die Indizes des Maximums mit[...arr.keys()].filter(i => arr[i] === max)
.[...arr.keys()]
gibt einen Fehler aus:unexpected token
In einer Zeile und wahrscheinlich schneller als
arr.indexOf(Math.max.apply(Math, arr))
:Wo:
iMax
- der beste Index so weit (der Index des max - Elements so weit, auf der ersten Iteration ,iMax = 0
da das zweite Argumentreduce()
ist0
, können wir nicht das zweite Argument weglassenreduce()
in unserem Fall)x
- das aktuell getestete Element aus dem Arrayi
- der aktuell getestete Indexarr
- unser Array ([0, 21, 22, 7]
)Über die
reduce()
Methode (aus "JavaScript: The Definitive Guide" von David Flanagan):quelle
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
, die wie folgt beschrieben werden kann: das Array aus Iterierte Index beginnend 0 (2. Parameter), wenn currentlyTestedValue höher als der Wert des Elements an der ist bestIndexSoFar , dann die Rückkehr currentlyTestedIndex auf die nächste Iteration als bestIndexSoFar .this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
.Hier ist eine andere Lösung: Wenn Sie ES6 mit dem Spread-Operator verwenden:
quelle
Wenn ich mich nicht irre, würde ich sagen, dass es darum geht, eine eigene Funktion zu schreiben.
quelle
Wenn Sie einen Unterstrich verwenden, können Sie diesen schönen kurzen Einzeiler verwenden:
In diesem Fall wird zuerst der Wert des größten Elements im Array ermittelt, in diesem Fall 22. Anschließend wird der Index zurückgegeben, in dem sich 22 innerhalb des Arrays befindet, in diesem Fall 2.
quelle
Eine andere Lösung von max mit
reduce
:Dies wird zurückgegeben,
[5e-324, -1]
wenn das Array leer ist. Wenn Sie nur den Index möchten, setzen Sie[1]
nach.Min via (Wechsel zu
>
undMAX_VALUE
):quelle
EDIT: Vor Jahren gab ich eine Antwort darauf, die grob, zu spezifisch und zu kompliziert war. Also bearbeite ich es. Ich bevorzuge die obigen funktionalen Antworten wegen ihres ordentlichen Faktors, aber nicht wegen ihrer Lesbarkeit. aber wenn ich mit Javascript besser vertraut wäre, würde ich sie vielleicht auch dafür mögen.
Pseudocode:
Verfolgen Sie den Index, der den größten Wert enthält. Angenommen, Index 0 ist anfangs am größten. Vergleichen Sie mit dem aktuellen Index. Aktualisieren Sie gegebenenfalls den Index mit dem größten Wert.
Code:
quelle
weitergeben
array
zuhaystack
undMath.max(...array)
zuneedle
. Dies gibt alle max-Elemente des Arrays an und ist erweiterbarer (zum Beispiel müssen Sie auch min-Werte finden).quelle
Wenn Sie eine Kopie des Arrays erstellen und absteigend sortieren, ist das erste Element der Kopie das größte. Dann finden Sie den Index im ursprünglichen Array.
Die zeitliche Komplexität beträgt O (n) für die Kopie, O (n * log (n)) für die Sortierung und O (n) für den Index.
Wenn Sie es schneller machen müssen, lautet Rys Antwort O (n).
quelle
quelle
Eine stabile Version dieser Funktion sieht folgendermaßen aus:
quelle
Einfach
quelle