1179 Stimmen

Finden Sie das Min/Max-Element eines Arrays in JavaScript

Wie kann ich leicht erhalten die minimale oder maximale Element eines JavaScript-Array?

Beispiel Pseudocode:

let array = [100, 0, 50]

array.min() //=> 0
array.max() //=> 100

178 Stimmen

Anmerkung: Mit ECMAScript 6 können Sie die neue Spread-Operator (drei Punkte: ... ) mit Math.max() wie diese: Math.max(...[2, 5, 16, 1]) . Siehe meine Antwort aus dem MDN-Dokumentation .

0 Stimmen

Hier ein Benchmark für einen Geschwindigkeitsvergleich der gebräuchlichsten Vorgehensweisen: jsben.ch/#/1QuTg

0 Stimmen

Ohne ES6 Math.max.apply(null, [2,5,16,1])

9voto

Cyberknight Punkte 159

Ich hatte das gleiche Problem, ich musste die minimalen und maximalen Werte eines Arrays ermitteln und zu meiner Überraschung gab es keine eingebauten Funktionen für Arrays. Nachdem ich viel gelesen hatte, beschloss ich, die "Top 3"-Lösungen selbst zu testen:

  1. diskrete Lösung: eine FOR-Schleife, die jedes Element des Arrays mit dem aktuellen Höchst- und/oder Mindestwert vergleicht;
  2. APPLY-Lösung: Senden des Arrays an die internen Funktionen Math.max und/oder Math.min mit apply(null,array);
  3. REDUCE-Lösung: Rekursive Prüfung jedes Elements des Arrays mit reduce(function).

Der Testcode war dieser:

function GetMaxDISCRETE(A)
{   var MaxX=A[0];

    for (var X=0;X<A.length;X++)
        if (MaxX<A[X])
            MaxX=A[X];

    return MaxX;
}

function GetMaxAPPLY(A)
{   return Math.max.apply(null,A);
}

function GetMaxREDUCE(A)
{   return A.reduce(function(p,c)
    {   return p>c?p:c;
    });
}

Das Array A wurde mit 100.000 zufälligen Integer-Zahlen gefüllt, jede Funktion wurde 10.000 Mal auf Mozilla Firefox 28.0 auf einem Intel Pentium 4 2.99GHz Desktop mit Windows Vista ausgeführt. Die Zeiten sind in Sekunden angegeben und wurden mit der Funktion performance.now() ermittelt. Die Ergebnisse waren diese, mit 3 Nachkommastellen und Standardabweichung:

  1. Diskrete Lösung: Mittelwert=0,161s, sd=0,078
  2. APPLY-Lösung: Mittelwert=3,571s, sd=0,487
  3. REDUCE-Lösung: Mittelwert=0,350s, sd=0,044

Die REDUCE-Lösung war 117 % langsamer als die diskrete Lösung. Die APPLY-Lösung war mit 2.118 % langsamer als die diskrete Lösung. Außerdem funktioniert sie, wie Peter feststellte, nicht für große Arrays (mehr als 1.000.000 Elemente).

Um die Tests zu vervollständigen, habe ich auch diesen erweiterten diskreten Code getestet:

var MaxX=A[0],MinX=A[0];

for (var X=0;X<A.length;X++)
{   if (MaxX<A[X])
        MaxX=A[X];
    if (MinX>A[X])
        MinX=A[X];
}

Die Zeitmessung: Mittelwert=0,218s, sd=0,094

Sie ist also 35 % langsamer als die einfache diskrete Lösung, aber sie ermittelt sowohl den Maximal- als auch den Minimalwert auf einmal (jede andere Lösung bräuchte mindestens doppelt so lange, um sie zu ermitteln). Sobald der Auftraggeber beide Werte benötigt, wäre die diskrete Lösung die beste Wahl (selbst als zwei getrennte Funktionen, eine für die Berechnung des Maximums und eine für die Berechnung des Minimums, würden sie die zweitbeste Lösung, die REDUCE-Lösung, übertreffen).

9voto

Shashwat Gupta Punkte 4257

let arr=[20,8,29,76,7,21,9]
Math.max.apply( Math, arr ); // 76

9voto

tvanfosson Punkte 506878

Gehen Sie nach und nach durch und behalten Sie dabei den Überblick.

var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
    var elem = arr[i];
    if (min === null || min > elem) min = elem;
    if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );

Wenn das Array keine Elemente enthält, wird min/max auf Null gesetzt. Setzt min und max in einem Durchgang, wenn das Array irgendwelche Elemente hat.

Sie können Array auch mit einer range Methode, um die Wiederverwendung zu ermöglichen und die Lesbarkeit zu verbessern. Ein funktionierendes Fiddle finden Sie unter http://jsfiddle.net/9C9fU/

Array.prototype.range = function() {

    var min = null,
        max = null,
        i, len;

    for (i = 0, len = this.length; i < len; ++i)
    {
        var elem = this[i];
        if (min === null || min > elem) min = elem;
        if (max === null || max < elem) max = elem;
    }

    return { min: min, max: max }
};

Verwendet als

var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];

var range = arr.range();

console.log(range.min);
console.log(range.max);

0 Stimmen

@JordanDillonChapian Ich würde dem zustimmen, aber es wäre trivial, dies auf eine range Funktion wäre das der beste Weg, um sowohl den Minimal- als auch den Maximalwert gleichzeitig zu erhalten - wie ich es mit einer Aktualisierung meiner Antwort getan habe.

5voto

Ben Punkte 547

Hier ist eine Möglichkeit, den Maximalwert aus einem Array von Objekten zu ermitteln. Erstellen Sie eine Kopie (mit slice), dann sortieren Sie die Kopie in absteigender Reihenfolge und nehmen Sie das erste Element.

var myArray = [
    {"ID": 1, "Cost": 200},
    {"ID": 2, "Cost": 1000},
    {"ID": 3, "Cost": 50},
    {"ID": 4, "Cost": 500}
]

maxsort = myArray.slice(0).sort(function(a, b) { return b.ID - a.ID })[0].ID;

5voto

Esin ÖNER Punkte 826

Sie können die Methoden von lodash verwenden

_.max([4, 2, 8, 6]);
returns => 8

https://lodash.com/docs/4.17.15#max

_.min([4, 2, 8, 6]);
returns => 2

https://lodash.com/docs/4.17.15#min

2 Stimmen

Diese Lösung funktioniert bei großen Arrays. Sie gibt nicht den Fehler Maximum call stack size exceeded

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X