it-swarm.com.de

Wie finde ich die größte Anzahl, die in einem JavaScript-Array enthalten ist?

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

[267, 306, 108]

Gibt es eine Funktion, die die größte Zahl in diesem Array finden würde?

193
dotty

zur Rettung zurückkehren:

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

Sie können die Apply-Funktion verwenden, um Math.max aufzurufen:

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

Wie es funktioniert?

Die Funktion apply wird verwendet, um eine andere Funktion mit einem gegebenen Kontext und Argumenten aufzurufen, die als Array bereitgestellt werden. Die Funktionen min und max können beliebig viele Eingabeargumente annehmen: Math.max (val1, val2, ..., valN)

Wenn wir also anrufen:

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

Die Apply-Funktion führt Folgendes aus:

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 und unabhängig davon funktionieren, was als Kontext übergeben wird.

189
CMS

Die einfachste Syntax mit dem neuen Operator spread :

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

Quelle: Mozilla MDN

41
A.I

Ich habe festgestellt, dass es sich für größere Arrays (~ 100.000 Elemente) tatsächlich lohnt, das Array einfach mit einer bescheidenen for-Schleife zu durchlaufen, die ~ 30% besser ist 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

35
Ja͢ck

Ich bin kein JS-Experte, aber ich wollte sehen, wie sich diese Methoden zusammensetzen. Das war eine gute Praxis für mich. Ich weiß nicht, ob dies technisch der richtige Weg ist, diese Leistungstests durchzuführen, aber ich habe sie direkt nacheinander ausgeführt, wie Sie in meinem Code sehen können.

Das Sortieren und Abrufen des 0-ten Werts ist bei weitem die schlechteste Methode (und ändert die Reihenfolge Ihres Arrays, was möglicherweise nicht erwünscht ist). Für die anderen ist der Unterschied vernachlässigbar, es sei denn, Sie sprechen Millionen von Indizes.

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

  • reduzierte 4.0392ms für die Ausführung
  • Math.max.apply hat 3.3742ms zum Ausführen benötigt
  • zum Sortieren und Abrufen des 0-ten Werts war 67.4724ms erforderlich
  • Math.max innerhalb von remove () benötigte 6.5804ms zur Ausführung
  • die benutzerdefinierte Findmax-Funktion benötigte 1.6102ms zur Ausführung

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)
34
redOctober13

Sie können das Array in absteigender Reihenfolge sortieren und das erste Element abrufen:

[267, 306, 108].sort(function(a,b){return b-a;})[0]
27
Gumbo

Wie wäre es damit:

var arr = [1,2,3,4];

var largest = arr.reduce(function(x,y){
       return (x > y) ? x : y;
});

console.log(largest);
22
brroshan

wie wäre es mit Array.reduce

[0,1,2,3,4].reduce(function(previousValue, currentValue){
  return Math.max(previousValue,currentValue);
});
8
CodeToad

Fast alle Antworten verwenden Math.max.apply(), was Nice und Dandy ist, aber Einschränkungen hat.

Funktionsargumente werden auf einen Stack gesetzt, der ein Minus hat - ein Limit. Wenn Ihr Array also größer als das Limit ist, schlägt es mit RangeError: Maximum call stack size exceeded. fehl.

Um eine Call Stack-Größe zu finden, habe ich diesen Code verwendet:

var ar = [];
for (var i = 1; i < 100*99999; i++) {
  ar.Push(1);
  try {
    var max = Math.max.apply(Math, ar);
  } catch(e) {
    console.log('Limit reached: '+i+' error is: '+e);
    break;
  }
}

Bei FireFox war es auf meinem Rechner am größten - 591519. Dies bedeutet, dass Math.max.apply() zu RangeError führt, wenn Ihr Array mehr als 591519 Elemente enthält.

Die beste Lösung für dieses Problem ist iterativ (Kredit: https://developer.mozilla.org/ ):

max = -Infinity, min = +Infinity;

for (var i = 0; i < numbers.length; i++) {
  if (numbers[i] > max)
    max = numbers[i];
  if (numbers[i] < min)
    min = numbers[i];
}

Ich habe über diese Frage in meinem Blog hier geschrieben.

4
lukas.pukenis

Max und Min Wert auf einfache und manuelle Weise ermitteln. Dieser Code ist viel schneller als Math.max.apply; Ich habe bis zu 1000.000 Zahlen in Array versucht.

function findmax(array)
{
    var max = 0;
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] > max)
        {
            max = array[counter];
        }
    }
    return max;
}

function findmin(array)
{
    var min = array[0];
    var a = array.length;
    for (counter=0;counter<a;counter++)
    {
        if (array[counter] < min)
        {
            min = array[counter];
        }
    }
    return min;
}
4
Yaser Ranjha

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18];
const maxNumber = Math.max(...inputArray);
console.log(maxNumber);

4
Abhijeet

Natürlich gibt es ja: Math.max.apply(null,[23,45,67,-45]) und das Ergebnis liefert 67;

3
user3702000

Um die größte Zahl in einem Array zu finden, müssen Sie nur Math.max(...arrayName); verwenden. Dies funktioniert folgendermaßen:

let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));

Es erhält also im Grunde die größte Nummer im Array und gibt sie an die Konsole aus. Wenn Sie die Triple Dots setzen, schreiben Sie im Grunde genommen Math.max([1, 2, 3, 4, 5, 6]);, was falsch ist.

2
Samuel Chen

Finden Sie die größte Zahl in einem mehrdimensionalen Array

var max = []; 

for(var i=0; arr.length>i; i++ ){

   var arra = arr[i];
   var largest = Math.max.apply(Math, arra);
   max.Push(largest);

   }
return max;
1
Liveindream

Sie können auch Array erweitern, damit diese Funktion Bestandteil jedes Arrays wird.

Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];

console.log( myArray.max() );
1
Izz

Ich habe gerade mit JS angefangen, aber ich denke, diese Methode wäre gut:

var array = [34, 23, 57, 983, 198];<br>
var score = 0;

for(var i = 0; i = array.length; i++) {
  if(array[ i ] > score) {
    score = array[i];
  }
}
1
Jakub Karki

Sie können dies versuchen,

var arr = [267,306,108];
var largestNum = 0;
for(i=0;i<arr.length;i++) {
   if(arr[i]>largest){
    var largest = arr[i];
   }
}
console.log(largest);
1
Aasha joney

Sie können auch forEach verwenden:

var maximum = Number.MIN_SAFE_INTEGER;

var array = [-3, -2, 217, 9, -8, 46];
array.forEach(function(value){
  if(value > maximum) {
    maximum = value;
  }
});

console.log(maximum); // 217

1

Vergessen Sie nicht, dass der Wrap mit Function.prototype.bind durchgeführt werden kann, wodurch Sie eine "all-native" Funktion erhalten.

var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5
1
Paul S.

Verwenden von - Array.prototype.reduce() ist cool!

[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)

wobei acc = akkumulator und val = aktueller wert;

var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);

console.log(a);
1
arora

Versuche dies

function largestNum(arr) {
  var currentLongest = arr[0]

  for (var i=0; i< arr.length; i++){
    if (arr[i] > currentLongest){
      currentLongest = arr[i]
    }
  }

  return currentLongest
}
0
Toufiq

Führen Sie das aus:

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

Und jetzt versuchen Sie [3,10,2].max() gibt 10

0
RegarBoy

Laut @ Quasimondos Kommentar , der offenbar weitestgehend verfehlt wurde, hat das Folgende die beste Leistung, wie hier gezeigt: https://jsperf.com/finding-maximum-element-in-an- Array . Beachten Sie, dass die Leistung für das betreffende Array möglicherweise keine nennenswerten Auswirkungen hat, bei großen Arrays jedoch an Bedeutung gewinnt und wie bereits erwähnt die Verwendung von Math.max() auch dann nicht funktioniert, wenn die Arraylänge mehr als 65535 beträgt. Siehe auch diese Antwort .

function largestNum(arr) {
    var d = data;
    var m = d[d.length - 1];
    for (var i = d.length - 1; --i > -1;) {
      if (d[i] > m) m = d[i];
    }
    return m;
}
0
James Ray

Max- und Min-Wert mit Bubble Sort finden

    var arr = [267, 306, 108];

    for(i=0, k=0; i<arr.length; i++) {
      for(j=0; j<i; j++) {
        if(arr[i]>arr[j]) {
          k = arr[i];
          arr[i] = arr[j];
          arr[j] = k;
        }
      }
    }
    console.log('largest Number: '+ arr[0]);
    console.log('Smallest Number: '+ arr[arr.length-1]);

0
Mano