43 votes

Cas de commutation avec conditions

Est-ce que j'écris le bon switch case ?

var cnt = $("#div1 p").length;
                alert(cnt);
                switch (cnt) {
                    case (cnt >= 10 && cnt <= 20):
                        alert('10');
                        break;
                    case (cnt >= 21 && cnt <= 30):
                       alert('21');
                        break;
                    case (cnt >= 31 && cnt <= 40):
               alert('31');
                        break;
                    default:
                        alert('>41');
                }

Pour une raison quelconque, l'alerte ne se produit pas lorsque les conditions sont réunies !

4 votes

Avez-vous entendu parler de l'instruction if...elseif...else ?

2 votes

La réponse correcte à cette question a reçu le moins de votes positifs. Voir la réponse de Fabien Ménager. Celle-ci devrait être la bonne. L'écriture de ce type de code à l'aide de switch est plus lisible que l'utilisation de l'instruction if else. J'utilise personnellement celle-ci dans des situations comme celle-ci.

88voto

deceze Points 200115

Un interrupteur fonctionne en comparant ce qui est dans switch() à chaque case .

switch (cnt) {
    case 1: ....
    case 2: ....
    case 3: ....
}

fonctionne comme ça :

if (cnt == 1) ...
if (cnt == 2) ...
if (cnt == 3) ...

Par conséquent, vous ne pouvez pas avoir de logique dans les instructions de cas.

switch (cnt) {
    case (cnt >= 10 && cnt <= 20): ...
}

fonctionne comme

if (cnt == (cnt >= 10 && cnt <= 20)) ...

et c'est juste une absurdité. :)

Utilice if () { } else if () { } else { } à la place.

0 votes

Je ne peux pas être plus d'accord avec votre nonsense partie

0 votes

Belle explication, mais switch utiliza === pas ==

32voto

rochal Points 4297

Vous ne devez pas utiliser switch pour ce scénario. C'est la bonne approche :

var cnt = $("#div1 p").length;

alert(cnt);

if (cnt >= 10 && cnt <= 20)
{
   alert('10');
}
else if (cnt >= 21 && cnt <= 30)
{
   alert('21');
}
else if (cnt >= 31 && cnt <= 40)
{
   alert('31');
}
else 
{
   alert('>41');
}

15 votes

Il n'y a rien de mal à utiliser le commutateur dans ce scénario. Je préfère switch à tout le reste pour cela.

9 votes

"Vous ne devriez pas utiliser le commutateur pour ce scénario" Pourquoi ?

26voto

Fabien Ménager Points 45472

Cela devrait fonctionner avec ce :

var cnt = $("#div1 p").length;

            switch (true) {
                case (cnt >= 10 && cnt <= 20):
                    alert('10');
                    break;
                case (cnt >= 21 && cnt <= 30):
                   alert('21');
                    break;
                case (cnt >= 31 && cnt <= 40):
                    break;
                default:
                    alert('>41');
            }

1 votes

Je n'ai pas dit que c'était un bon code ;) Et le switch permet ceci. C'est comme lorsque vous écrivez if ( 2 == myVar)

3 votes

Il n'y a rien de mal à cette déclaration d'échange et c'est exactement ce qui est prévu. En d'autres termes, vous demandez "Donnez-moi l'instruction "true"" et vous exécutez ce code pour cela. Personnellement, je préfère l'instruction "switch" à un tas d'instructions "if..else if ".

1 votes

Vous feriez mieux de remplacer >=21 par >20 et ainsi de suite.

10voto

Pete Robie Points 91

Une idée qui m'est venue en essayant de travailler sur un spinner était de permettre une certaine flexibilité dans le script sans utiliser une tonne de si déclarations.

Comme c'est une solution plus simple que d'itérer à travers un tableau pour vérifier une seule instance d'une classe présente, cela permet de garder le script plus propre. Toute suggestion pour nettoyer davantage le code est la bienvenue.

$('.next').click(function(){
        var imageToSlide = $('#imageSprite'); // Get id of image

        switch(true) {
            case (imageToSlide.hasClass('pos1')):
                imageToSlide.removeClass('pos1').addClass('pos2');
                break;
            case (imageToSlide.hasClass('pos2')):
                imageToSlide.removeClass('pos2').addClass('pos3');
                break;
            case (imageToSlide.hasClass('pos3')):
                imageToSlide.removeClass('pos3').addClass('pos4');
                break;
            case (imageToSlide.hasClass('pos4')):
                imageToSlide.removeClass('pos4').addClass('pos1');
        }
    }); `

7voto

jAndy Points 93076

Ce que vous faites, c'est chercher des résultats (0) ou (1).

(cnt >= 10 && cnt <= 20) renvoie soit vrai soit faux.

--edit-- vous ne pouvez pas utiliser la casse avec les expressions booléennes (logiques). L'instruction cnt >= 10 renvoie zéro pour faux ou un pour vrai. Par conséquent, elle nous donnera case(1) ou case(0), ce qui ne correspondra jamais à la longueur. --edit--

1 votes

Andy, tu as probablement un point que je ne peux pas suivre. Tu peux reformuler ça ? Qu'est-ce que je fais de mal ?

0 votes

Vous ne pouvez pas utiliser la casse avec les expressions booléennes (logiques). L'instruction cnt >= 10 renvoie zéro pour faux ou un pour vrai. Par conséquent, elle nous donnera case(1) ou case(0), ce qui ne correspondra jamais à la longueur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X