218 votes

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

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

[267, 306, 108]

Existe-t-il une fonction qui permettrait de trouver le plus grand nombre dans ce tableau ?

26 votes

Math.max(...[267, 306, 108]);

323voto

Crescent Fresh Points 54070

Resig à la rescousse :

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

Avertissement car le nombre maximum d'arguments est aussi bas que 65535 sur certaines VMs Utilisez une boucle for si vous n'êtes pas certain que le tableau est si petit.

0 votes

Christ. 90 rep en 3 minutes pour une réponse qui aurait été plus rapide à googler.

16 votes

Ah, mais maintenant il a le SO Sticker de qualité qui y est fixé d'une manière légèrement tordue !

2 votes

Pour info, si les performances sont un facteur déterminant dans votre solution, je voudrais tester que comparée à votre propre fonction facilement codée pour s'assurer qu'elle fonctionne bien. Nous avons tendance à supposer que l'implémentation native sera plus rapide ; en fait, le coût de l'implémentation de l apply L'appel peut se laver très facilement.

208voto

CMS Points 315406

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

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

Comment cela fonctionne-t-il ?

El appliquer est utilisée pour appeler une autre fonction, avec un contexte donné et des arguments, fournis 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 on appelle :

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

La fonction d'application sera exécutée :

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

Notez que le premier paramètre, le contexte, n'est pas important pour ces fonctions puisqu'elles sont statiques. Elles fonctionneront indépendamment de ce qui est passé comme contexte.

2 votes

Whoa, vous avez mis sur vos réponses avec beaucoup d'efforts :D

1 votes

C'est génial. Mais que se passe-t-il si la longueur de mon tableau dépasse la limite de taille des paramètres (de la fonction) ? Que faire alors ?

1 votes

J'aime mieux cette réponse que les autres car elle explique ce que tout fait et pourquoi. +1

37voto

Jack Points 88446

J'ai constaté que pour les tableaux les plus grands (~100k éléments), il est plus avantageux de simplement itérer le tableau avec un simple for avec des performances supérieures d'environ 30 % à celles de la boucle 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'évaluation comparative

4 votes

Pour info, il est de 84% maintenant sur Chrome 31.

33voto

Gumbo Points 279147

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

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

5 votes

Je suppose que vous pouvez également trier et obtenir le dernier élément... ?

0 votes

@Shog9 : Oui, mais vous devrez spécifier la fonction de comparaison vous-même : sort(function(a,b){return b-a;})

9 votes

Ah. Je pensais plutôt à : [...].sort().pop()

9voto

CodeToad Points 1004

Utilisez Array.reduce :

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

0 votes

La valeur initiale doit être fixée à -Infinity .

0 votes

@Jack, pourquoi cela est-il nécessaire ? Même avec un tableau de tous les nombres négatifs, j'obtiens un résultat valide.

1 votes

C'est le cas limite où le tableau est vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X