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?
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?
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.
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.
Die einfachste Syntax, mit der neuen Spread-Operator :
var arr = [1, 2, 3];
var max = Math.max(...arr);
Quelle: Mozilla MDN
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:
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)
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;
}
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.