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 :

Eviter les répétitions de "if"


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut Eviter les répétitions de "if"
    Bonjour,

    Je débute en JavaScript. Je voudrais juste savoir si y a d'autres manières (plus propre) de faire que celle-ci :

    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
                const title = document.getElementById('title');
                const description = document.getElementById('description');
                const answer = document.getElementById('answer');
                const supportExchanges = document.getElementById('supportExchanges');
     
                if (text.value.length > 0) {
                    // FIXME: Supprimer data quand on fera appel à l'API Flask
                    const data = "data/predictions.json";
                    const json = { "instances": [ text.value ] };
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
                } else if (title.value.length > 0){
                    var value = title.value;
                    const data = "data/predictions.json";
                    const json = { "instances" : [{"title" : value}]};
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
                } else if (description.value.length > 0){
                    var value = description.value;
                    const data = "data/predictions.json";
                    const json = { "instances" : [{"description" : value}]};
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
                } else if (answer.value.length > 0){
                    var value = answer.value;
                    const data = "data/predictions.json";
                    const json = { "instances" : [{"answer" : value}]};
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
                } else if (supportExchanges.value.length > 0){
                    var value = supportExchanges.value;
                    const data = "data/predictions.json";
                    const json = { "instances" : [{"supportExchanges" : value}]};
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
                } else {
                    // FIXME: Supprimer data quand on fera appel à l'API Flask
                    const data = "data/data-v7.json";
                    app.csvToJson(fileUploaded, data, API_URL);
                }
    De plus je voudrais savoir s'il est possible de faire des "combinaisons" c'est à dire que l'utilisateur rentre ce qu'il veut dans mon champs, tous les champs ne sont pas obligatoires. Soit titre seul, ou par exemple juste titre et description. Comment pourrai-je faire pour faire cela ? Mise à part une multitude de "if". Si je n'ai pas été claire en gros j'aimerai éviter les if dans d'autres if.
    Eviter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                if (text.value.length > 0) {
                    // FIXME: Supprimer data quand on fera appel à l'API Flask
                    const data = "data/predictions.json";
                    if(description.value.length > 0){
     
                        if(answer.value.length > 0){
     
                        }
                    }
                    const json = { "instances": [ text.value ] };
                    console.log("Json instances : ", json);
                    app.getJSON(json, data, API_URL);
    Je vous remercie et vous souhaite une agréable journée !

  2. #2
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Utiliser plusieurs if else ce n'est pas forcément mal propre et parfois tu ne peux pas faire autrement (switch est moins polyvalent)...

    Ah oui après pour les champs tu peux les traiter séparément avec des gestionnaires d’événement...

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 885
    Points : 6 620
    Points
    6 620
    Par défaut
    Sans rentrer dans les détails, ne pourrais tu pas faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const fields = ['text', 'title', 'description', 'answer', 'supportExchanges'],
          json = { "instances": []},
          params = {};
     
    for (const field of fields) {
        const value = document.getElementById(field).value;
        if ( value.length )
            params[field] = value;
    }
     
    json.instances.push(params);

  4. #4
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    @ CosmoKnacki ce sont des if / else if. donc il manque un break dans ton code.

    @Kewty
    comme tu n'indique pas d'ou proviennent tes différents inputs, et que tu oublie aussi de reférencer ton champ "text" ( CosmoKnacki en fait abstraction), je suis partie de l'idée que tes champs sont réunis dans un même DIV :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      <div id="block-inputs">
        <input type="text" id="text"             value="" placeholder="text" />
        <input type="text" id="title"            value="" placeholder="title"  />
        <input type="text" id="description"      value="" placeholder="description" />
        <input type="text" id="answer"           value="" placeholder="answer" />
        <input type="text" id="supportExchanges" value="" placeholder="supportExchanges" />
      </div>

    ce qui permet d'écrire
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        var json = { "instances": null };
     
        for (const elm_input of document.querySelectorAll('#block-inputs > input')) 
        {
          if (elm_input.value)
          {
            json.instances = (elm_input.id==='text') ? [elm_input.value] : [{[elm_input.id] : elm_input.value}];
            break;
          }
        }
     
        console.log( JSON.stringify(json))
     
        if (!json.instances)  { app.csvToJson(fileUploaded, "data/data-v7.json", API_URL); }
        else                  { app.getJSON(json, "data/predictions.json", API_URL)  }

  5. #5
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    @ CosmoKnacki ce sont des if / else if. donc il manque un break dans ton code.
    Effectivement pour le premier cas mais je crois que CosmoKnacki répondait à la deuxième partie où "...tous les champs ne sont pas obligatoires...".


    Citation Envoyé par psychadelic Voir le message
    for (const elm_input of document.querySelectorAll('#block-inputs > input'))
    Je me pose une question : est-ce que l’instruction document.querySelectorAll('#block-inputs > input') n'est exécutée qu'une fois ou bien à chaque tour de boucle ?

    Comment le savoir ? Peut-être en modifiant le HTML entre deux boucles (il faudra un point d’arrêt) ?

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut
    Merci à tous pour vos réponses je vais essayé les différentes méthodes que vous m'avez données. Je mettrai le code !

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 39
    Points : 50
    Points
    50
    Par défaut Problème résolu
    Merci encore pour vos messages, du coup j'ai pris ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const fields = ['text', 'title', 'description', 'answer', 'supportExchanges'],
          json = { "instances": []},
          params = {};
     
    for (const field of fields) {
        const value = document.getElementById(field).value;
        if ( value.length )
            params[field] = value;
    }
     
    json.instances.push(params);
    Il fonctionne à merveille et évite les répétitions de if ! Encore merci à tous bonne et agréable journée

  8. #8
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 742
    Points
    4 742
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Je me pose une question : est-ce que l’instruction document.querySelectorAll('#block-inputs > input') n'est exécutée qu'une fois ou bien à chaque tour de boucle ?
    Oui, c'est une bonne question...
    perso je crois pas, mais dans le doute, j'éviterai ce code.

    Je ne voulais pas trop compliquer mon code, car l'utilisattion d'un querySelectorAll marche plutôt avec un forEach, mais ce denier n'accepte pas de break.

    Que l'on peu contourner ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const BreakException = {};
    try {
      document.querySelectorAll('#block-inputs > input').forEach( elm_input=>{
        console.log( elm_input.id )
        if (elm_input.value) throw BreakException;
      });
    } catch (e) {
      if (e!==BreakException) throw e; // c'est une toute autre erreur
    }

  9. #9
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Ok merci. Oui effectivement en cas de doute autant éviter...

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 058
    Points : 44 588
    Points
    44 588
    Par défaut
    Bonjour,
    Citation Envoyé par Beginner
    Je me pose une question : est-ce que l’instruction document.querySelectorAll('#block-inputs > input') n'est exécutée qu'une fois ou bien à chaque tour de boucle ?
    pour la boucle for..of c'est un protocole « itérable » qui est utilisé, la réponse est une fois en début.

    Concernant le sujet abordé une boucle for, à l'ancienne, serait tout à fait justifiée et suffisante

  11. #11
    Membre expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 886
    Points : 3 725
    Points
    3 725
    Par défaut
    Merci pour l'info.

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

Discussions similaires

  1. Eviter les répétitions grâce à la boucle for
    Par RetardedGenji dans le forum Tkinter
    Réponses: 1
    Dernier message: 19/06/2017, 19h24

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