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

Vue hybride

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

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2017
    Messages : 63
    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 684
    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 684
    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 684
    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 684
    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 confirmé
    Homme Profil pro
    Autre
    Inscrit en
    Août 2017
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Août 2017
    Messages : 63
    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
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    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 ?

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    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
    Membre extrêmement actif Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 532
    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

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 209
    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