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
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
Warum braucht man dafür eigentlich ein Objekt? Es ist doch nur eine Funktion, die Sie am Ende verwenden. Und warum definieren Sie Ihr Array zweimal?
Die Hauptlösung ist hier nicht die Array-Erstellungskonvention oder die Zuweisung von Werten an eine Variable. Sie können Array in jeder beliebigen Form erstellen und den Wert zuweisen, wie Sie möchten.
Linearer, fast rein funktionaler Ansatz
var min=[0, 29, 25].map((function(max) {max=-Infinity; return function(e) {return max=Math.max(max, e);}})())[0]
Weitere Beispiele:
Herausfinden min Wert
function getMin(arr) {
return (ar || [0, 29, 25]).
map((function(max) {max=-Infinity; return function(e) {return max=Math.max(max, e);}})())[0];
}
oder mit Array.map
Methode mit variabler Schließung
function getMin(arrObjs) {
return (arrObjs || [{val: 0}, {val: 29}, {val: 25}]).
map((function(max) {max=-Infinity; return function(e) {return max=(max.val>e.val?max:e);}})())[0];
}
Herausfinden max Wert
function getMax(arr) {
return (ar || [0, 29, 25]).
map((function(v) {v=Infinity; return function(e) {return v=Math.min(v, e);}})())[0];
}
für Array von Objekten
function getMax(arrObjs) {
return (arrObjs || [{val: 0}, {val: 29}, {val: 25}]).
map((function(v) {v=-Infinity; return function(e) {return v=(v.val<e.val?v:e);}})())[0];
}
Möglicherweise möchten Sie dem Array-Prototyp keine Methoden hinzufügen, die mit anderen Bibliotheken in Konflikt geraten könnten.
Ich habe gesehen, eine Menge von Beispielen verwenden forEach, die ich nicht für große Arrays aufgrund seiner schlechten Leistung gegenüber einer for-Schleife empfehlen würde. https://coderwall.com/p/kvzbpa/don-t-use-array-foreach-use-for-instead
Auch Math.max(Math, [1,2,3]);
Ich bekomme immer NaN?
function minArray(a) {
var min=a[0]; for(var i=0,j=a.length;i<j;i++){min=a[i]<min?a[i]:min;}
return min;
}
function maxArray(a) {
var max=a[0]; for(var i=0,j=a.length;i<j;i++){max=a[i]>max?a[i]:max;}
return max;
}
minArray([1,2,3]); // returns 1
Wenn Sie ein Array von Objekten haben, akzeptiert die Funktion minArray() 2 Parameter, der erste ist das Array und der zweite ist der Schlüsselname für den zu vergleichenden Objektschlüsselwert. Die Funktion würde in diesem Fall den Index des Arrays zurückgeben, der den kleinsten angegebenen Schlüsselwert hat.
function minArray(a, key) {
var min, i, j, index=0;
if(!key) {
min=a[0];
for(i=0,j=a.length;i<j;i++){min=a[i]<min?a[i]:min;}
return min;
}
min=a[0][key];
for(i=0,j=a.length;i<j;i++){
if(a[i][key]<min) {
min = a[i][key];
index = i;
}
}
return index;
}
var a = [{fee: 9}, {fee: 2}, {fee: 5}];
minArray(a, "fee"); // returns 1, as 1 is the proper array index for the 2nd array element.
Warum ist dies die beste Antwort? Die erste Antwort sollte lauten stackoverflow.com/a/1669222/390014
Ja, ich würde zustimmen, um die Math.min.apply() für die Suche nach der minimalen primitive Array-Wert zu verwenden, ich erinnere mich an Kommentare zu sehen, die den Aufruf anwenden weglassen, die mir die Null-Antwort gab, weshalb ich mit der ersten Lösung kam. Obwohl meine zweite Lösung sollte immer noch Verdienst für Objekt-Arrays halten, natürlich, es sei denn, es gibt eine bessere ein :)
Wenn Sie ein komplexes Objekt haben, können Sie sort.... verwenden, z. B.: Wenn ich ein Element erhalten möchte, das den MAX/MIN-Wert der folgenden Objekte enthält.
var objs= [
{name:"Apple",value:3},
{name:"Love",value:32},
{name:"Cheese",value:1},
{name:"Pork",value:77},
{name:"Xmas",value:99}
];
Ich werde eine Auswahl treffen:
objs.sort(function(a, b){return a.value-b.value});
Dann: objs[0]
ist das MIN, objs[objs.length-1]
ist der MAX.
Die sort
das Array tatsächlich aktualisieren, wie in der Antwort von @Ben erwähnt. OP ist nur über das Erhalten der min/max Wert.
Sie könnten eine Kopie des aktuellen Arrays erstellen, es sortieren und Min/Max erhalten. Ein paar zusätzliche Zeilen Code. Wie auch immer, ich habe gerade versucht, eine alternative Lösung zu posten. lol. Und das Array, an dem ich gearbeitet habe, hat 3 Ebenen von Objekten, ich muss min/max aus der 2ten Ebene holen. Es war nicht nur, um min/max von single valued array zu erhalten.
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.
178 Stimmen
Anmerkung: Mit ECMAScript 6 können Sie die neue Spread-Operator (drei Punkte:
...
) mitMath.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])
2 Stimmen
In ES6 können sowohl das Maximum als auch das Minimum wie folgt ermittelt werden mit nur einem
reduce
aufrufen .0 Stimmen
Die Lösung von @totymedli, den Spread-Operator zu verwenden, ist keine gute Idee. Wenn das Array zu groß ist, führt dies zu einer Stack Overflow Exception (zu viele Parameter werden an die Funktion übergeben). Eine viel bessere Idee ist die Verwendung von
reduce
1 Stimmen
@AronFiechter Haben Sie meine Antwort tatsächlich gelesen? Ich erkläre alle Optionen sehr detailliert mit Codebeispielen und Benchmarks. Die Größe des Aufrufstapels ist nur dann ein Problem, wenn Ihre Arrays eine Größe von mehr als 100000 haben. Der Aufrufstapel muss zwar berücksichtigt werden, aber in den meisten Fällen ist er kein Problem und der prägnantere Code überwiegt die Nachteile.
1 Stimmen
Dieser Aufrufstapel kann ein Problem darstellen. Es gibt eine HackerRank-Frage, bei der Min und Max gefunden werden müssen, und die Tests laufen unter einem Limit von 10 Sekunden. Die von HackerRank für den 9. bis 14. Test übergebenen Arrays haben eine Länge von mehr als 100.000 und schlagen fehl, wenn die reduzierte Lösung in der Antwort unten verwendet wird. Die for-Schleife wird für einige
0 Stimmen
Utilice
...
(Spread-Operator):const maxValue = Math.max(...array))