IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Faire un équivalent de switch() pour une plage de valeurs


Sujet :

JavaScript

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Faire un équivalent de switch() pour une plage de valeurs
    Bonjour,

    Je voudrais simplifier cette écriture mais je ne vois pas comment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		if(exactWF<10){}
    		if(exactWF>=10 && exactWF<20){}
    		if(exactWF>=20 && exactWF<50){}
    		// ... jusqu'à 500 avec 7 tranches inégales et croissantes

  2. #2
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Bonjour,

    Déjà, il n'est pas utile de parcourir tous les if.
    Il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if
    else if
    else if
    ...
    else
    Ensuite, il faudrait savoir ce qui se trouve dans chaque {}, pour éventuellement factoriser ce qui peut l'être.

    Enfin, pas sûr qu'un switch() apporte une amélioration quelconque.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    Déjà, il n'est pas utile de parcourir tous les if.
    Il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if
    else if
    else if
    ...
    else
    Merci, j'aurais du y penser mais il y a longtemps que je n'ai pas codé.

    Citation Envoyé par jreaux62 Voir le message
    Ensuite, il faudrait savoir ce qui se trouve dans chaque {}, pour éventuellement factoriser ce qui peut l'être.
    Pour chaque condition, je positionne juste une variable n=1, n=2 dans l'ordre, c'est à dire que je numérote les tranches.

    Citation Envoyé par jreaux62 Voir le message
    Enfin, pas sûr qu'un switch() apporte une amélioration quelconque.
    Je ne pense pas non plus, c'est pour cela que j'ai parlé d'équivalent de switch()

  4. #4
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    if / else if / else est bien un équivalent de switch .

    Cela dit, on peut simplifier (grâce aux else if) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		if(exactWF<10){} // inférieur à 9
    		else if(exactWF<20){} // entre 10 et 19
    		else if(exactWF<50){} // entre 20 et 49
    		// ... jusqu'à 500

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    sinon un switch true
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     switch (true){
               case (exactWF<10) : // inférieur à 9
                                            break;
    	   case (exactWF<20) :  // entre 10 et 19
                                            break;
    	   case (exactWF<50) : // entre 20 et 49
    		// ... jusqu'à 500
    }
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    sinon un switch true
    Bien vu !
    Ça ne me serait pas venu à l'idée... mais j'en prend bonne note.
    N.B. Cela dit, on est d'accord qu'on n'y gagne pas grand chose (ça prend même plus de caractères)

    Sinon, en prenant les conditions "à l'envers" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		if(exactWF>=500){} // supérieur à 500 (inclus)
    		else if(exactWF>=300){} // entre 499 et 300
    		else if(exactWF>=200){} // entre 299 et 200
    		// ... jusqu'à 0
    on arrive à une fonction :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function return_n_from_wf( wf )
    {
      let n;
      // tranches (à définir selon tes critères)
      // important : ordre décroissant !
      let wf_arr = [500,300,200,100,50,20,10,0];
      // valeurs de n
      let n_arr = [8,7,6,5,4,3,2,1]; 
      for( let i=0; i<wf_arr.length; i++ )
      {
        if(wf>=wf_arr[i])
        {
          return n_arr[i]; // retourne le n correspondant + on sort de la boucle
        }
      }
      return 0; // retourne 0 sinon
    }
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    n = return_n_from_wf( exactWF );

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    N.B. Cela dit, on est d'accord qu'on n'y gagne pas grand chose (ça prend même plus de caractères)
    Oui!
    Le seul avantage que j'y vois est peut-être la clarté du code ? Mais c'est subjectif ...
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 201
    Par défaut
    Bonjour,
    il m'est arrivé de traiter des « switch à trous » en utilisant la méthode findIndex() des Array, utile quand cela devient un peu trop tordu.

    Un exemple pourrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const tabSwitch = [10, 20, 40, 80, 160, 320];
    const valSwitch = ["<= à 10", "<= 20", "<= 40", "<= 80", "<=160", "<= 320"];  // on peut mettre ce que l'on veut voire des référence à des fonctions
    const valRef = 127;
    const index = tabSwitch.findIndex((val) => valRef <= val);
    console.log(valSwitch[index] || "non trouvée");
    on pourrait rendre cette « écriture plus élégante » via l'utilisation d'un objet et/ou d'une fonction autonome ... « Mais c'est subjectif ... »

    PS :
    Citation Envoyé par jreaux62
    on arrive à une fonction :
    c'est dans le même esprit !

  9. #9
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Citation Envoyé par moimp Voir le message
    // ... jusqu'à 500 avec 7 tranches inégales et croissantes
    moimp ne dis pas ce qui se passe au delà de 500...

    Dans ma fonction, j'ai traité ce cas.
    C'est pour cette raison que les nombres sont dans l'ordre décroissant (sinon il aurait fallu traiter ce cas, avec un peu de code supplémentaire)

    Dans la proposition de NoSmoking, au delà de 320 (selon l'exemple), ça affiche "non trouvée".

    @NoSmoking : peux-tu expliquer cette ligne ?
    VU ! syntaxe expliquée dans la doc : .findIndex()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const index = tabSwitch.findIndex((val) => valRef <= val);

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci à vous trois. Je ne m'attendais pas à ce qu'une discussion apparemment anodine suscite autant de contributions. Sans m'y attendre, j'ai appris beaucoup de choses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 05/06/2008, 11h04
  2. Réponses: 26
    Dernier message: 06/01/2007, 13h11
  3. Réponses: 4
    Dernier message: 16/11/2006, 10h08
  4. Réponses: 5
    Dernier message: 18/10/2006, 16h54
  5. équivalent de DragQueryFile pour une URL ?
    Par OutOfRange dans le forum Delphi
    Réponses: 2
    Dernier message: 14/10/2006, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo