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 ?
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 ?
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.
Ah, mais maintenant il a le SO Sticker de qualité qui y est fixé d'une manière légèrement tordue !
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.
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.
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 ?
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;
}
@Shog9 : Oui, mais vous devrez spécifier la fonction de comparaison vous-même : sort(function(a,b){return b-a;})
Utilisez Array.reduce :
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
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.
26 votes
Math.max(...[267, 306, 108]);