2010-09-22 6 views
0

hey tout .. je besoin d'une fonction qui reviendrait un nombre précédent et suivant, mais seulement dans ma gamme de numéros. ainsi, par exemple, si ma gamme est de 0 à 7, et im sur 6 - devrait revenir à côté 7. si im sur 7 - devrait revenir à côté 0 (il fait demi-tour à elle).précédent/suivant dans une plage de nombres

même pour précédent, si im sur 0, avant devrait être 7. Je pense que modulo peut être utilisé pour comprendre cela, mais ne peux pas comprendre comment. la fonction doit prendre 3 arguments: le nombre actuel, le nombre maximum et si nous revenons en arrière ou en avant. quelque chose comme

getPreviousOrNext (0, 7, "suivant" ou "prev")

merci !!!

Répondre

1

est-ce un devoir à la maison?
je n'utiliser modulo, une poignée de if/ternaires devraient être suffisantes.

+0

pas son .. pas son travail pour ... mais je ne veux pas utiliser un tas de si ELSE ... Theres dois être un moyen plus facile. – toli

+1

Ouais, si/sinon c'est difficile. – GZipp

+0

Je pense que son point est probablement si/n'est pas élégant – Mark

2

utilisation modulo ..

function getPreviousOrNext(now, max, direction) { 
    totalOptions = max + 1; //inlcuding 0! 

    newNumber = now; // If direction is unclear, the number will remain unchanged 
    if (direction == "next") newNumber = now + 1; 
    if (direction == "prev") newNumber = now + totalOptions - 1; //One back is same as totalOptions minus one forward 

    return newNumber % totalOptions; 
} 

(pourrait être plus courte, mais cela rend plus compréhensible)

Edit: Le "maintenant + totalOptions - 1" nous empêche d'entrer dans les nombres négatifs (- 1% 7 = -1)

Edit2: Ouch, il y avait une petite erreur dans le code ... "Si la direction n'est pas claire, le nombre restera inchangé" n'était pas correct!

Edit3: Et pour un bonus, voici comment je l'ai écrit avant de lire le code complet ;-) (suppose qu'il est « à côté » chaque fois qu'il est pas « prev »). Ce qui est laid et beau dans un:

function getPreviousOrNext(now, max, direction) { 
    return (now + ((direction=="prev")?max:1)) % (max + 1); 
} 
+0

gentil. ----- – webbiedave

+0

Je pensais avoir attrapé une erreur, mais non, c'était magnifique! :) +1 – DashK

+0

oui, bon, merci! – toli

1
var cycle_range = function (high, current) { 
    return new function() { 
     this.next = function() { 
      return current = (current+1) % (high+1); 
     }; 

     this.previous = function() { 
      return current = (current+high) % (high+1); 
     }; 
    } 
}; 

cycle_range(7, 0).next() // 1 

var the_range = cycle_range(7, 0); 
the_range.next() // 1 
the_range.next() // 2 
the_range.previous() //1 
the_range.previous() //0 
the_range.previous() //7 
+0

OO solution, sympa! – Jochem