2012-12-10 8 views
4

Possible en double:
How might I find the largest number contained in a JavaScript array?trouver le plus grand nombre entier dans le tableau javascript

Je ne parviens pas à obtenir ce code au travail, je l'ai été à elle pendant un certain temps à essayer de comprendre. Quand je regarde la console, il affiche simplement 0 quelqu'un peut-il m'aider à comprendre ce que j'ai fait de mal. Voici mon code:

var array = [3 , 6, 2, 56, 32, 5, 89, 32]; 
var largest= 0; 

for (i=0; i<=largest;i++){ 
    if (array>largest) { 
     var largest=array[i]; 
    } 
} 




console.log(largest); 
+0

Le plus grand nombre d'un tableau vide doit être '-Infinity'. –

Répondre

5

Le code ci-dessous est fixe et devrait fonctionner. Le problème était que dans cette ligne if (array>largest) { Vous ne fournissiez pas l'index du tableau. En changeant le code à ceci if (array[i]>largest) { cela fonctionne. Notez que j'ai ajouté le [i] à la fin de array dans l'instruction if.

var array = [3 , 6, 2, 56, 32, 5, 89, 32]; 
var largest= 0; 

for (i=0; i<=largest;i++){ 
    if (array[i]>largest) { 
     var largest=array[i]; 
    } 
} 




console.log(largest); 
+0

Merci c'était fini! –

+0

Ne pas redéclarer plus grand dans l'instruction if. Vous avez déjà déclaré la var dans l'ouverture sous tableau. – Geuis

+2

Cela ne devrait pas être la réponse acceptée, car il existe des moyens plus efficaces de le faire. – Geuis

3

Vous avez quelques petites erreurs. Tout d'abord:

if (array>largest) { 

Il devrait plutôt être:

if (array[i]>largest) { 

Deuxième:

for (i = 0; i <= largest; i++) { 

devrait être

for (i = 0; i <= array.length; i++) { 
+0

Merci! cela a corrigé –

1

Vous avez dans votre code deux questions. Tout d'abord, array>largest devrait être array[i]>largest. Deuxièmement, vous déclarez une nouvelle variable la plus grande à l'intérieur du if qui n'est pas la même que celle à l'extérieur. Supprimez var de l'affectation de la nouvelle valeur la plus grande.

16
var arr = [3, 6, 2, 56, 32, 5, 89, 32]; 
var largest = arr[0]; 

for (var i = 0; i < arr.length; i++) { 
    if (largest < arr[i]) { 
     largest = arr[i]; 
    } 
} 
console.log(largest); 
  • Vous devez définir i ou bien elle devient une variable globale.
  • Ne redéfinissez pas le plus grand dans la boucle.
  • Puisque vous parcourez le tableau, utilisez i < array.length au lieu de i <= largest.
  • Puisque vous comparez chacun des éléments du tableau à largest, utilisez if(largest < array[i]) au lieu de if(array > largest)
  • Vous devez définir plus égal au premier élément du tableau, car si tous les chiffres sont négatifs?
  • array est un nom de variable incorrect car il est trop similaire à Array (le constructeur de tableau). Essayez plutôt arr.

Une doublure:

var largest = Math.max.apply(0, array);

Plus d'infos ici: Javascript max() function for 3 numbers

+0

Malheureusement, Math.max est disponible en option pour les très grandes baies. Dans les tests que je suis en train de faire, la longueur maximale du tableau que Math.max peut gérer est de 123679 éléments. Cela change probablement sur la plate-forme javascript, mais cela montre que Math.max est * presque * aussi rapide que l'itération directe, mais n'est pas aussi rapide et échoue pour les très grandes baies. – Geuis

+0

@Geuis Je ne le savais pas, mais cela ressemble plus à un problème de mémoire pour moi. Cela pourrait être dû à la façon dont 'apply' est implémenté. Sur quelle plateforme testez-vous? Avez-vous un lien vers votre test? –

+0

Voici un jsperf que j'ai modifié avec des cas de test supplémentaires. http://jsperf.com/array-sorting-javascript-stack/2 Notez que Math.max apparaît légèrement plus rapide dans Firefox, mais pas beaucoup plus rapidement. Apparaît une bonne vieille boucle et si le test est le plus rapide. J'ai ajouté des contrôles pour la négation, et pour voir si les comparaisons ternaires pourraient être plus rapides. Ils ne le sont pas. – Geuis

2
var array = [3 , 6, 2, 56, 32, 5, 89, 32]; 
var largest= array[0]; 

for (i=0; i<=largest;i++){ 
    if (array[i]>largest) { 
     var largest=array[i]; 
    } 
} 
+0

Ceci est re-déclarer «plus grand» dans la boucle au lieu de l'assigner –

5

Juste une ligne :)

var array = [3 , 6, 2, 56, 32, 5, 89, 32], 
    largest = array.sort().reverse()[0]; 

ou mieux encore

... 
    largest = array.sort()[array.length - 1]; 

UPD, tout le code ci-dessus est suce quand vous ajoutez par exemple 9 dans le tableau je pense que par le nombre par défaut traités comme des chaînes de tri, il y a meilleure version

var array = [3 , 6, 2, 56, 32, 5, 89, 32, 9], largest; 
array.sort(function(a, b) { 
    largest = a > b ? a: b; 
}); 

bien que dans la performance boucle forEach sage suggéré dans les commentaires sont meilleurs http://jsperf.com/array-sorting-javascript-stack

UPD2, d'accord, le code ci-dessus a quelques mauvaises parties, donc ne fonctionnera pas comme prévu. Un autre essai:

array.sort(function(a, b) { 
    return a - b; 
}); 
largest = array[array.length - 1]; 
+0

Cool, mais le tri est plus lent. –

+0

@LarryBattle comparer avec quoi? voici jsperf http://jsperf.com/array-sorting-javascript-stack, le seul drowback ici est si vous avez des éléments définis par null, mais devez vérifier si – dmi3y

+0

Ceci est une méthode TRÈS inefficace. Les types de tableaux js sont plutôt lents. http://jsfiddle.net/ychWw/ Dans mes tests simples, method1 se termine en environ 50ms, alors que votre méthode prend 5 secondes. – Geuis

Questions connexes