220 Stimmen

Wie kann ich die größte Zahl in einem JavaScript-Array finden?

Ich habe ein einfaches JavaScript-Array-Objekt, das ein paar Zahlen enthält.

[267, 306, 108]

Gibt es eine Funktion, mit der sich die größte Zahl in diesem Feld finden lässt?

323voto

Crescent Fresh Punkte 111444

Resig ist die Rettung:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};

Warnung : da die maximale Anzahl der Argumente beträgt bei einigen VMs nur 65535 Verwenden Sie eine for-Schleife, wenn Sie nicht sicher sind, dass das Array so klein ist.

209voto

Christian C. Salvadó Punkte 763569

Sie können die Funktion apply verwenden, um die Math.max :

var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306

Wie funktioniert das?

Le site anwenden. Funktion wird verwendet, um eine andere Funktion mit einem bestimmten Kontext und Argumenten, die als Array bereitgestellt werden, aufzurufen. Die Funktionen min und max können eine beliebige Anzahl von Eingabeargumenten annehmen: Math.max(val1, val2, ..., valN)

Wenn wir also anrufen:

Math.min.apply(Math, [1, 2, 3, 4]);

Die Funktion apply wird ausgeführt:

Math.min(1, 2, 3, 4);

Beachten Sie, dass der erste Parameter, der Kontext, für diese Funktionen nicht wichtig ist, da sie statisch sind. Sie funktionieren unabhängig davon, was als Kontext übergeben wird.

66voto

A.I Punkte 1408

Die einfachste Syntax, mit der neuen Spread-Operator :

var arr = [1, 2, 3];
var max = Math.max(...arr);

Quelle: Mozilla MDN

47voto

redOctober13 Punkte 3209

Ich bin kein JavaScript-Experte, aber ich wollte sehen, wie diese Methoden stapeln, so war dies eine gute Übung für mich. Ich weiß nicht, ob dies technisch der richtige Weg ist, um die Leistung 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. Wertes ist bei weitem die schlechteste Methode (und es ändert die Reihenfolge Ihres Arrays, was möglicherweise nicht erwünscht ist). Bei den anderen Methoden ist der Unterschied vernachlässigbar, es sei denn, es handelt sich um Millionen von Indizes.

Durchschnittliche Ergebnisse von fünf Durchläufen mit einem 100.000-Index-Array von Zufallszahlen:

  • reduzieren nahm 4,0392 ms zum Laufen
  • Math.max.apply nahm 3,3742 ms zum Laufen
  • Sortieren und Ermitteln des 0. Wertes dauerte 67,4724 ms zum Laufen
  • Math.max innerhalb von reduce() nahm 6,5804 ms zum Laufen
  • benutzerdefinierte findmax-Funktion genommen 1,6102 ms zum Laufen

var performance = window.performance

function findmax(array)
{
    var max = 0,
        a = array.length,
        counter

    for (counter=0; counter<a; counter++)
    {
        if (array[counter] > max)
        {
            max = array[counter]
        }
    }
    return max
}

function findBiggestNumber(num) {
  var counts = []
  var i
  for (i = 0; i < num; i++) {
      counts.push(Math.random())
  }

  var a, b

  a = performance.now()
  var biggest = counts.reduce(function(highest, count) {
        return highest > count ? highest : count
      }, 0)
  b = performance.now()
  console.log('reduce took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest2 = Math.max.apply(Math, counts)
  b = performance.now()
  console.log('Math.max.apply took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest3 = counts.sort(function(a,b) {return b-a;})[0]
  b = performance.now()
  console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest4 = counts.reduce(function(highest, count) {
        return Math.max(highest, count)
      }, 0)
  b = performance.now()
  console.log('Math.max within reduce() took ' + (b - a) + ' ms to run')

  a = performance.now()
  var biggest5 = findmax(counts)
  b = performance.now()
  console.log('custom findmax function took ' + (b - a) + ' ms to run')
  console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5)

}

findBiggestNumber(1E5)

38voto

Ja͢ck Punkte 165747

Ich habe festgestellt, dass es sich bei größeren Arrays (~100k Elemente) tatsächlich lohnt, das Array einfach mit einer bescheidenen for Schleife, die ~30% besser abschneidet als Math.max.apply() :

function mymax(a)
{
    var m = -Infinity, i = 0, n = a.length;

    for (; i != n; ++i) {
        if (a[i] > m) {
            m = a[i];
        }
    }

    return m;
}

Benchmark-Ergebnisse

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