web-dev-qa-db-fra.com

Comment pourrais-je trouver le plus grand nombre contenu dans un tableau JavaScript?

J'ai un objet JavaScript Array simple contenant quelques chiffres.

[267, 306, 108]

Existe-t-il une fonction qui trouverait le plus grand nombre dans ce tableau?

193
dotty

Resig à la rescousse:

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

Vous pouvez utiliser la fonction apply pour appeler Math.max :

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

Comment ça marche?

La fonction apply est utilisée pour appeler une autre fonction, avec un contexte et des arguments donnés, fournie sous forme de tableau. Les fonctions min et max peuvent prendre un nombre arbitraire d'arguments en entrée: Math.max (val1, val2, ..., valN)

Donc, si nous appelons:

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

La fonction apply va exécuter:

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

Notez que le premier paramètre, le contexte, n’est pas important pour ces fonctions car elles sont statiques, elles fonctionneront indépendamment de ce qui est passé en tant que contexte.

189
CMS

La syntaxe la plus simple, avec le nouvel opérateur spread :

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

Source: Mozilla MDN

41
A.I

J'ai constaté que pour les tableaux de plus grande taille (~ 100 000 éléments), il est rentable de simplement itérer le tableau avec une humble boucle for, ce qui représente ~ 30% de mieux que 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;
}

Résultats de l'indice de référence

35
Ja͢ck

Je ne suis pas un expert du JS, mais je voulais voir comment se combinaient ces méthodes. C'était donc une bonne pratique pour moi. Je ne sais pas si c'est techniquement la bonne façon de tester ces performances, mais je les ai juste exécutées l'une après l'autre, comme vous pouvez le constater dans mon code.

Trier et obtenir la 0e valeur est de loin la pire méthode (et cela modifie l'ordre de votre tableau, ce qui peut ne pas être souhaitable). Pour les autres, la différence est négligeable sauf si vous parlez de millions d'indices.

Résultats moyens de cinq analyses avec un tableau de nombres aléatoires de 100 000 indices:

  • réduire a pris 4.0392ms à courir
  • Math.max.apply a pris 3,33742ms pour s'exécuter
  • trier et obtenir la 0e valeur a pris 67,4724ms à courir
  • Math.max dans reduction () a eu 6.5804ms à courir
  • fonction findmax personnalisée a pris 1.6102ms pour s'exécuter

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

Vous pouvez trier le tableau par ordre décroissant et obtenir le premier élément:

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

Que dis-tu de ça:

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

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

console.log(largest);
22
brroshan

que diriez-vous d'utiliser Array.reduce

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

Presque toutes les réponses utilisent Math.max.apply() qui est sympa mais qui a des limites.

Les arguments de fonction sont placés sur une pile qui a un inconvénient - une limite. Donc, si votre tableau est plus grand que la limite, il échouera avec RangeError: Maximum call stack size exceeded.

Pour trouver une taille de pile d'appels, j'ai utilisé ce code:

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;
  }
}

Il s’est avéré être le meilleur produit sur FireFox sur ma machine - 591519. Cela signifie que si votre tableau contient plus de 591519 éléments, Math.max.apply() entraînera RangeError.

La meilleure solution à ce problème est la méthode itérative (crédit: 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];
}

J'ai écrit sur cette question sur mon blog ici .

4
lukas.pukenis

Trouver les valeurs max et min de manière simple et manuelle. Ce code est beaucoup plus rapide que Math.max.apply; J'ai essayé jusqu'à 1000k nombres dans le tableau.

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

Oui, bien sûr, existe: Math.max.apply(null,[23,45,67,-45]) et le résultat renvoie 67;

3
user3702000

Pour trouver le plus grand nombre dans un tableau, il vous suffit d'utiliser Math.max(...arrayName);, cela fonctionne comme suit:

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

Donc, en gros, il récupère le plus grand nombre dans le tableau et le transmet à la console. Vous mettez les points triple, car sans cela, vous écrivez fondamentalement Math.max([1, 2, 3, 4, 5, 6]); qui est faux.

2
Samuel Chen

Trouver le plus grand nombre dans un tableau multidimensionnel

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

Vous pouvez aussi étendre Array pour avoir cette fonction et en faire une partie de chaque tableau.

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

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

Je viens de commencer avec JS mais je pense que cette méthode serait bien:

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

Tu peux essayer ça,

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

Vous pouvez également utiliser forEach :

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
Benny Neugebauer

N'oubliez pas que le bouclage peut être effectué avec Function.prototype.bind, ce qui vous donne une fonction "tout-native" function.

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

Essaye ça

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

Lance ça:

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

Et maintenant, essayez [3,10,2].max() renvoie 10

0
RegarBoy

Selon le commentaire de @ Quasimondo, qui semble avoir été en grande partie manqué, les résultats ci-dessous semblent avoir la meilleure performance illustrée ici: https://jsperf.com/finding-maximum-element-in -un tableau . Notez que, même si pour le tableau de la question, les performances peuvent ne pas avoir d’effet significatif, pour les tableaux de grande taille, elles deviennent plus importantes, et encore comme indiqué utiliser Math.max() ne fonctionne même pas si la longueur du tableau est supérieure à 65535. Voir aussi cette réponse .

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

Trouver les valeurs maximale et minimale à l'aide du tri à bulles

    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