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?
Array.max = function( array ){
return Math.max.apply( Math, array );
};
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.
La syntaxe la plus simple, avec le nouvel opérateur spread :
var arr = [1, 2, 3];
var max = Math.max(...arr);
Source: Mozilla MDN
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;
}
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:
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)
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]
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);
que diriez-vous d'utiliser Array.reduce ?
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
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 .
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;
}
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);
Oui, bien sûr, existe: Math.max.apply(null,[23,45,67,-45])
et le résultat renvoie 67
;
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.
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;
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() );
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];
}
}
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);
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
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
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
}
Lance ça:
Array.prototype.max = function(){
return Math.max.apply( Math, this );
};
Et maintenant, essayez [3,10,2].max()
renvoie 10
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;
}
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]);