2013-03-10 3 views
2

Je me demande s'il existe un moyen plus efficace d'encercler un tableau. Pour mes besoins, le tableau contient des sources d'images. Lorsque la dernière image est affichée et que le bouton suivant est enfoncé, il revient à la première image. Si le bouton précédent est enfoncé sur la première image, il tourne vers la dernière image.Un moyen efficace de contourner un tableau?

C'est ce que j'ai pu trouver, mais je pense qu'il y a une façon plus efficace de s'y prendre.

var marker = 0; 

// Circle through an array. 
function moveMarker(array, action, direction) { 
    if (!direction) { 
     if(marker == array.length - 1) 
      marker = -1; 
     marker += 1; 
     action(); 
    } 

    else { 
     if (marker == 0) 
      marker = array.length; 
     marker -=1; 
     action(); 
    } 
} 

Répondre

9

Oui, vous pouvez utiliser l'opérateur % modulo:

var marker = 0; 

// Circle through an array. 
function moveMarker(array, action, direction) { 
    if (!direction) { 
     marker = (marker + 1) % array.length; 
    } 
    else { 
     marker = (marker + array.length - 1) % array.length; 
    } 
    action(); 
} 

ou même:

var marker = 0; 

// Circle through an array. 
function moveMarker(array, action, direction) { 
    marker = (marker + array.length + (direction ? -1 : 1)) % array.length; 
    action(); 
} 
+0

Oh mec, c'est beaucoup plus lisse. Merci beaucoup d'avoir contribué à mon apprentissage acharné. – iamnotoriginal

+0

+1 Slick est le mot. Rend ma solution ternaire simple ... bien, simple. Devra se souvenir de cela comme une solution de recyclage de réseau à l'avenir. – guypursey

1

Tout d'abord, vous pouvez simplifier les if/else en utilisant les mathématiques, et enlever les limites vérification en utilisant modulo.

var marker = 0; 

// Circle through an array. 
function moveMarker(array, action, direction) { 
    var increment = direction ? 1 : -1; 
    marker = Math.modulo(marker + increment, array.length);   
    action(); 
} 

Je suggère, cependant, un marqueur incorporant dans un objet, plutôt que d'avoir une variable globale:

function markerMover(array, action, direction) { 
    var marker = 0; 
    function next() { 
     var increment = direction ? 1 : -1; 
     marker = Math.modulo(marker + increment);   
     action(); 
    } 
} 
var mover = new markerMover(someArray, someAction, someDirection); 
mover.next() 
// or even 
var intervalHandle = setInterval(mover.next, 25); 
+0

Je vais certainement tenir compte de vos conseils à propos de faire partie d'un objet. Même en tant que preuve de concept, j'aurais probablement dû le faire de toute façon. – iamnotoriginal

0

Déclarez une variable locale dès le départ pour prendre soin de la dernière position de votre choix, puis utilisez le ternary operator pour déterminer ce qui doit être fait avec . L'opérateur ternaire vous permet essentiellement d'effectuer une condition sur la même ligne que vous effectuez une opération. Après cela, vous devriez seulement besoin d'un appel pour action().

function moveMarker(array, action, direction) { 
    var a = array.length - 1; 

    if (!direction) { 
     marker += (marker === a) ? -(a) : 1; 
    } else { 
     marker += (marker === 0) ? (a) : -1; 
    } 

    action(); 
}; 

TIP EXTRA: Vous pouvez également regarder mettre ces fonctions (à savoir, moveMarker() et action()) en un seul objet en tant que méthodes de sorte que vous n'êtes pas déclarer et modification d'une variable globale comme . Mais sans connaître le reste de votre code, je ne sais pas si cette approche fonctionnerait pour vous ou non.

Questions connexes