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 :

Utilisation de indexOf


Sujet :

JavaScript

  1. #1
    Membre du Club
    Homme Profil pro
    Autre
    Inscrit en
    Août 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2017
    Messages : 63
    Points : 45
    Points
    45
    Par défaut Utilisation de indexOf
    Bonjour à tous

    je ne suis pas un grand seigneur du javascript et j'ai un souci que je n'arrive pas à comprendre

    voici une fonction que j'ai faite
    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
    function check(numbers, stars){
      let tir = {
        5: [2,3,4,5,6,7,8,9,10,11,12], 
        6: [2,3,4,5,6,7,8,9,10,11,12],
        7: [2,3,4,5,6],
        8: [2,3,4],
        9: [2,3],
        10: [2]
      }
     
      let list = tir[numbers];
      if(list.indexOf(stars) != -1){
        return true;
      } else {
        return false;
      }
    }
    cette fonction est faite pour verifier si je peux mettre X nombre et Y étoiles
    par exemple sir je met numbers a 5 et stars a 2
    5: [2,3,4,5,6,7,8,9,10,11,12],
    ici je sais que si numbers est égal à 5, stars peut avoir les valeurs 2,3,4,5,6,etc...

    donc list = tir[5];

    avec jsbin, codepen ect quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(list.indexOf(stars));
    ça me renvoit 0, normal puisque tir[0] = 2
    là mon code fonctionne.

    je le teste sur mon site ça me retourne -1, donc il ne le trouve pas

    pour essayer de comprendre je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(numbers+'|'+stars+'|'+list+'|'+list.indexOf(stars));
    en retour j'ai ceci
    5|2|2,3,4,5,6,7,8,9,10,11,12|-1
    je ne comprends pas pourquoi il ne le trouve pas alors qu'avec jsbin ou autre, cela fonctionne.

    Quelqu'un aurait il une réponse à me donner.

    Merci à vous

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Bonjour,

    Pas de raison que tu aies une différence en ligne; les 2 versions de ta page sont forcément différentes (imbrication de fonctions, problème de portée de variables, appel de check...

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    tu peux aussi gérer ton test comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function check(numbers, stars){
      let tir = {
        5: [2,3,4,5,6,7,8,9,10,11,12], 
        6: [2,3,4,5,6,7,8,9,10,11,12],
        7: [2,3,4,5,6],
        8: [2,3,4],
        9: [2,3],
        10: [2]
      };
    /* true = nombre et étoiles existent
       false = étoiles n'existe pas
       invalide = nombre n'existe pas */
      return tir[numbers] ? tir[numbers].includes(stars): "invalide";

  4. #4
    Membre du Club
    Homme Profil pro
    Autre
    Inscrit en
    Août 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2017
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par javatwister Voir le message
    Bonjour,

    Pas de raison que tu aies une différence en ligne; les 2 versions de ta page sont forcément différentes (imbrication de fonctions, problème de portée de variables, appel de check...
    je ne comprends pas car en voyant les résultats que me donnais mon site, j'ai fais un copier coller sur jsbin et codepen

    pour ce que tu m'a donner je regarde ça ce soir et te redis.

    Merci à toi javatwister

  5. #5
    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 740
    Points
    4 740
    Par défaut
    Les implémentation de javascript ne se valent pas toutes.

    quand tu écrit let tir = { 5: [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ....

    il faut avoir en tête qu'ici la clé est considérée comme un string et non comme un entier ayant pour valeur 5

    ce qui est équivalent à let tir = { '5': [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ....

    en principe les interpréteurs JS font la conversion des entiers en string ( et inversement) selon les besoin du code.
    donc écrire tir[numbers est automatiquement converti en tir[numbers.toString(10)], mais dans ton cas , j'ai un doute...

    l'autre truc qui me chiffonne dans ton code (mais c'est une question de puriste) c'est la fait d' utiliser "numbers" comme nom pour une variable parce que c'est très proche de la classe d'objet Number de JS. faut avoir une pensée pour ceux font beaucoup de maintenance de code, donner des noms de variables synonymes à celle des éléments syntaxiques d'un langage apporte plus de confusion que de clarté; alors pitié pour ceux qui te relisent.


    autre probleme, ton code ne vérifie pas que la valeur de num existe bien comme clé dans l'objet tir

    Donc dans ton code une solution pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function check(num, stars)
      {
      let tir = { 5: [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
                , 6: [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 
                , 7: [ 2, 3, 4, 5, 6] 
                , 8: [ 2, 3, 4] 
                , 9: [ 2, 3] 
                , 10: [ 2] 
                } 
      if (!tir[num.toString(10)]) return false   // vérifie l'existence de la clé
      return (tir[num.toString(10)].indexOf(stars) != -1)
      }

    PS:
    Citation Envoyé par colem Voir le message
    quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(list.indexOf(stars));
    ça me renvoi 0, normal puisque tir[0] = 2
    c'est faux: tir[0] n'existe pas.

    tu veux dire tir['5'][0] === 2 ?
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    en principe les interpréteurs JS font la conversion des entiers en string ( et inversement) selon les besoin du code.
    donc écrire tir[numbers est automatiquement converti en tir[numbers.toString(10)], mais dans ton cas , j'ai un doute...
    Pour un nom de propriété de l'objet "tir", ça paraît logique, oui;
    N'empêche que si tu demandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for(i in tir){
      console.log(isNaN(i))}
    tu obtiens false à tous les coups avec la configuration actuelle;

    Sinon, je proposais le même test que toi avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return tir[numbers] ? tir[numbers].includes(stars): "invalide";

  7. #7
    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 740
    Points
    4 740
    Par défaut
    Citation Envoyé par javatwister Voir le message
    N'empêche que si tu demandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     for(i in tir){
      console.log(isNaN(i))}
    tu obtiens false à tous les coups avec la configuration actuelle;
    non cela ne révèle rien du tout
    la fonction isNaN permet de savoir si une valeur peut ou non être traitée comme numérique

    la preuve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const Str25 = '25' 
     
    console.log('Str25:  isNaN?=',isNaN(Str25), ' type=', typeof(Str25)) // -> Str25  Nan?= false  type= string
    plus significatif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(elmKey in tir) { console.log( elmKey, '->', typeof(elmKey) ) }
    renvoie:
    5 -> string
    6 -> string
    7 -> string
    8 -> string
    9 -> string
    10 -> string
    sinon, pour la petite histoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    console.log("Str25 + 3 =>", Str25 + 3, typeof(Str25 + 3)   )  // -> Str25 + 3 => 253 string
    console.log("Str25 * 3 =>", Str25 * 3, typeof(Str25 * 3)   )  // -> Str25 * 3 => 75 number
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  8. #8
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Ah oui, rigolo.
    Je ne pense pas que ça fasse bugger un interpréteur, quand même; le transtypage est un avantage...

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par psychadelic Voir le message
    sinon, pour la petite histoire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    console.log("Str25 + 3 =>", Str25 + 3, typeof(Str25 + 3)   )  // -> Str25 + 3 => 253 string
    console.log("Str25 * 3 =>", Str25 * 3, typeof(Str25 * 3)   )  // -> Str25 * 3 => 75 number


    D'où la force d'evaluation de JS

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    pour commencer le choix d'un objet est plus que douteux dans ton cas puisque visiblement tu utilises un index 5, 6, 7, 8, 9 ...

    Les propriétés des objets sont de préférence de type String pour des raisons de manipulation et d'écriture conforme au format JSON.

    Dans ce cas autant utiliser un tableau de tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const tir = [];
    tir[5] = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    tir[6] = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    tir[7] = [2, 3, 4, 5, 6];
    tir[8] = [2, 3, 4];
    tir[9] = [2, 3];
    tir[10] = [2];
    ou autre forme d'écriture.

    Les tests deviennent plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let list = tir[numbers] || [];
    if (list.indexOf(stars) != -1) {
      return true;
    } else {
      return false;
    }
    l'appel hors indice ne lèvera pas d'erreur et renverra -1 ce qui est le but recherché, donc pas besoin de contorsion hasardeuse



    Citation Envoyé par psychadelic
    l'autre truc qui me chiffonne dans ton code (mais c'est une question de puriste) c'est la fait d' utiliser "numbers" comme nom pour une variable parce que c'est très proche de la classe d'objet Number de JS.
    Je ne vois pas où il y a problème tant que ce ne sont pas des mots clés qui sont utilisés, pour les francophones il y a effectivement moyen de faire autrement mais demande à un codeur anglophone, ou utilisant l'anglais dans le codage, de faire autrement !

  11. #11
    Membre du Club
    Homme Profil pro
    Autre
    Inscrit en
    Août 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2017
    Messages : 63
    Points : 45
    Points
    45
    Par défaut
    alors je vous remercie tous pour m'avoir aiguillé.

    voilà ce que j'ai fais et maintenant ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function check(numbers, stars){
      let tir = {
        '5': ['2','3','4','5','6','7','8','9','10','11','12'], 
        '6': ['2','3','4','5','6','7','8','9','10','11','12'],
        '7': ['2','3','4','5','6'],
        '8': ['2','3','4'],
        '9': ['2','3'],
        '10': ['2']
      }
     
      let list = tir[numbers];
      return list.includes(stars);
    }

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    @colem :
    Tu ne fais toujours pas de vérification sur l'existence de la clé de ton objet tir que tu passes en paramètre.

    En utilisant la méthode includes il faut être conscient que tu ne sera plus compatible IE même si cela devient de moins en moins nécessaire


    @psychadelic :
    Pourquoi avoir édité ton post pour mettre en gras ce passage :
    Citation Envoyé par psychadelic
    . faut avoir une pensée pour ceux font beaucoup de maintenance de code, donner des noms de variables synonymes à celle des éléments syntaxiques d'un langage apporte plus de confusion que de clarté; alors pitié pour ceux qui te relisent.
    que, j'avoue ne pas mieux comprendre !

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

Discussions similaires

  1. Probleme avec indexof
    Par lilli1407 dans le forum API standards et tierces
    Réponses: 17
    Dernier message: 08/11/2006, 15h37
  2. [C#] Problème avec .indexOf()...
    Par FoxDeltaSierra dans le forum ASP.NET
    Réponses: 7
    Dernier message: 20/10/2005, 21h53
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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