2010-09-23 8 views

Répondre

5

Vous pouvez utiliser la boucle suivante pour le faire. J'ai inclus une page entière à des fins de test.

<html> 
    <body> 
     <script type="text/javascript"> 
      var i; var y = 0; var val = 321; var zones = [0,150,300,400,600,800]; 
      for (i = 0; i < zones.length; i++) 
       if (val >= zones[i]) 
        y = i; 
      document.write("Value " + val + " is at position " + y); 
     </script> 
    </body> 
</html> 

Utilisation de diverses données de test:

Value -99 is at position 0 
Value 0 is at position 0 
Value 149 is at position 0 
Value 150 is at position 1 
Value 321 is at position 2 
Value 521 is at position 3 
Value 799 is at position 4 
Value 800 is at position 5 
Value 999 is at position 5 
+0

Merci, cela fonctionne très bien! – John

+0

@John Si les performances vous importent alors vous pourriez envisager d'utiliser la méthode de recherche binaire. – ErikE

+2

Quelques remarques spécifiques à JS: 'var' n'est pas vraiment optionnel en JavaScript, dans cet exemple ne semble pas faire de différence, puisque tous les identifiants sont globaux, mais déconseillés car, par exemple, si vous mettez le code ci-dessus dans une fonction, les identifiants seront toujours rendus globaux, par ailleurs, le nouveau ECMAScript 5 [Strict Mode] (http://j.mp/dzg47V) n'autorise pas les assignations sur les identifiants non déclarés. En outre, l'instruction 'for-in' pourrait ressembler à' foreach' en C#, PHP, Perl, etc, mais ne l'est pas, le but de 'for-in' est de * énumérer * les propriétés de l'objet, le ordre de dénombrement n'est pas garanti ... – CMS

0

Le tableau de nombres est-il trié par ordre croissant? Si c'est le cas, alors vous avez deux options. Si la taille de la matrice est relativement petite, parcourez-la simplement avec un cycle et trouvez la zone appropriée. Sinon, implémentez une recherche binaire (beaucoup plus rapide).

+0

Oui, il est dans l'ordre croissant. La taille du tableau est petite, mais peut être grande dans le futur. Merci, je vais essayer. – John

3

Si votre tableau est très grand, en vérifiant chaque élément sera lent. Une recherche binaire pourrait être bonne dans ce cas. Voici quelques exemples de code (non testé, mais aussi bien pensé que je peux faire à ce moment de la nuit):

function checkZone(mouseX) { 
    var low = 0, high = zones.length, i; 
    if (mouseX >= zones[high]) { 
     low = high 
    } 
    while (high - low > 1) { 
     i = low + Math.floor((high - low)/2); 
     if (mouseX >= zones[i]) { 
     low = i; 
     } else { 
     high = i; 
     } 
    } 
    return zones[low]; 
} 

Remarque: J'essayé de poster il y a cette 15 minutes, mais SO mangé ma réponse et je a dû refaire la plupart de celui-ci.

+0

Cela n'est utile que si le tableau est grand, sinon il est plus rapide de parcourir chaque élément jusqu'à ce qu'il soit trouvé car il y a moins de conditions à évaluer. – vol7ron

+1

@vol C'est ** ce que j'ai dit, première phrase dans mon post. Merci de l'avoir renforcé, cependant. J'imagine. :) – ErikE

+1

Oui, la première partie de ce que j'ai dit renforcé. La deuxième partie, j'ai ajouté avec juste un peu plus d'explications. De bons algorithmes combinent les deux. Il commence avec le binaire et une fois qu'il a atteint un certain nombre, il passe à la comparaison énumérée littérale. – vol7ron

-1

Cela devrait être mieux et plus vite:

console.clear(); 

    var zones = [800, 400, 150, 0, 300, 600];    // unsorted array 
    zones.sort();           // sort for function comparison 
    console.log(zones); 

    function checkZone(mouseX) { 
     for(var i = (zones.length-1); mouseX < zones[i--];){ } 
     return ++i; 
    } 


    // perform 25 tests with random mouseX values 0-1000 
    for (var rnd=1,runs=25; runs-- && (rnd=Math.floor(Math.random()*1000))>=0;){ 
     console.log((25-runs) + ". " 
        + "mouseX:" + rnd + " , " 
        + "index:" + checkZone(rnd)   // checkZone(number) is all that's really needed 
       ); 
    } 

La boucle for dans la fonction recherche le tableau à partir de la dernière valeur du tableau au début. Une fois que le param n'est plus inférieur à la valeur du tableau, la boucle se ferme et la fonction renvoie cet élément. Nous devons en ajouter un à la variable return car la boucle n'ajoute pas 1 lorsque la condition de boucle échoue.

Si vous ne vous sentez pas à l'aise avec console.log, vous pouvez le remplacer par document.write ou alert. Une fois les tests terminés, tout ce dont vous avez besoin est le tableau trié, la fonction et l'appel de la fonction. Vous pouvez mettre au rebut la boucle de test et tout le nombre aléatoire jibber-jabber.

Exemple de sortie:

[0, 150, 300, 400, 600, 800] 
    1. mouseX:458 , index:3 
    2. mouseX:17 , index:0 
    3. mouseX:377 , index:2 
    4. mouseX:253 , index:1 
    5. mouseX:446 , index:3 
    6. mouseX:764 , index:4 
    7. mouseX:619 , index:4 
    8. mouseX:653 , index:4 
    9. mouseX:337 , index:2 
    10. mouseX:396 , index:2 
    11. mouseX:107 , index:0 
    12. mouseX:820 , index:5 
    13. mouseX:850 , index:5 
    14. mouseX:117 , index:0 
    15. mouseX:659 , index:4 
    16. mouseX:393 , index:2 
    17. mouseX:906 , index:5 
    18. mouseX:128 , index:0 
    19. mouseX:435 , index:3 
    20. mouseX:712 , index:4 
    21. mouseX:841 , index:5 
    22. mouseX:259 , index:1 
    23. mouseX:447 , index:3 
    24. mouseX:809 , index:5 
    25. mouseX:892 , index:5 
+1

Si vous voulez faire un pas en arrière dans le tableau, la méthode javascript la plus rapide est 'while (i--) {}', pas une boucle 'for'. – ErikE

+1

C'est faux; pas tout à fait faux, mais pas toujours juste. 'for (i; i -;) {}' est plus rapide/égal. C'est plus du côté "égal" car cela varie. Voir mon [JSFiddle] (http://jsfiddle.net/FZqZN/3409/) dans le cadre de ma réponse à [la question de sommation la plus rapide] (http://stackoverflow.com/questions/3762589/fastest-javascript-summation/ 3762735 # 3762735). Cette reverse-for-loop est essentiellement la même chose qu'une reverse-while-loop, mais il y a des avantages à la mise en cache de la for-loop, ce qui lui donne un avantage mineur. – vol7ron

+0

Il semble que je suis harcelé par quelqu'un qui n'aime pas entendre leur réponse était mauvaise. Mis à part l'addition de l'algorithme binaire d'Emtucifor, qui ne s'applique pas à la petite taille de tableau donnée dans la question, ma solution est la meilleure. – vol7ron

Questions connexes