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

AJAX Discussion :

[AJAX] Boucle for in anti doublons


Sujet :

AJAX

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut [AJAX] Boucle for in anti doublons
    Bonjour,
    J'ai un tableau associatif javaScript que je transforme en tableau indicé
    pour le boucler avec un indice peu importe pourquoi...

    mon but était d'utiliser une expression régulier et un return false quand la valeur d'une colonne change,un truc dans ce genre...
    j'ai 18 valeurs mais c'est en réalité que 2 chaines de caractères qui se répètent 9 fois et 9 fois.Cet équilibre est le fruit du hasard...
    et là je me rend compte que la boucle for in me mâche le boulot en etait anti doublons et en ne retennant que les 2 chaines de caractères differentes.
    J'ai testé sur IE8 et FF3
    (avec 18 fois des valeurs différentes j'ai 18 alert() de valeurs différentes)

    Est-ce exact?

    Merci

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    Citation Envoyé par laurentg2003 Voir le message
    Est-ce exact?
    Bien sûr, puisque tu le dis : on te croit sur parole

    Par contre, si tu nous montrais le code en question, quelqu'un pourrait peut-être trouver une erreur ou te donner une explication

    A+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Oui c'est vrai
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    var xmlhttp = false;
    if (window.ActiveXObject) {
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
       xmlhttp = new XMLHttpRequest();
       xmlhttp.overrideMimeType('text/xml');
    }
    function exReq(){
       clearTimeout(newtimer);
       //var state = document.forms[0].elements[0].value;
       //var url = 'ajax.php?state='// + state;
       xmlhttp.open('GET','ajax.php',true);
       xmlhttp.onreadystatechange = writeResponse;
       xmlhttp.send(null);
       
    
    }
    
    function writeResponse() {
    
    str1="";
    str2="";
    str3="";
    var state=xmlhttp.status;
    
    switch (xmlhttp.readyState){
    case(2):var appel1 = setTimeout(str1=rqSent(state),1000);
    clearTimeout(appel1);
    break;
    case(3):var appel2 = setTimeout(str2=waitRq(state),1000);
    clearTimeout(appel2);break;
    case(4):var appel3 = setTimeout(str3=response(state),1000);
    clearTimeout(appel2);
    break;
    
    
    } 
    
    var exReg=new RegExp("=[a-zA-Z0-9/.: ]*\]","g");//erreur caractere facultatif ignoré + pb <>  extension jpg jpeg ou particularité javaScript/ajax
    var chaine=str3.match(exReg).toString();
    //alert(chaine);
    var exReg2=new RegExp(",+","g");
    var tab=chaine.split(exReg2);
    //extraction des ids
    //var exRegID=new RegExp("#[0-9]*#","g");
    //var chaineID=str3.match(exRegID).toString();
    //alert(tabID[i].substring(1,tabID[i].length-1));
    var fraction = new Array();
    var newtab = new Array();
    var table = new Array();
    
    //var tabID=chaineID.split(exReg2);
    //var tableau = new Array();
    
    
    for (var i=0; i<tab.length; i++) {
       
    	fraction[i]="'"+tab[i].substring(1,tab[i].length-1)+"'";
    	  //ch="tableau"+i+"= new Array('"+fraction[i]+"');";
    		//eval(ch); 
    	
    			
    }				  
    
    
                               
    var dataBase= new Array();				
    for (var j=0; j<18; j++) {
                        newtab[j]=fraction.slice(0,5);
    					       var  unechaine=newtab[j]+"";
    						    ch="dataBase["+j+"]= new Array("+unechaine+");";
    							
    		                     eval(ch);
    						
    					    fraction.splice(0,5);
    				
    			
    					
            
    					 
    	                 
    			 
    		 
    }
    var dataPiste=new Array();
    var dataGrandTitre=new Array();
    var dataImage=new Array();
    var dataMiniature=new Array();
    for (var k=0; k<18; k++) {
    //alert(dataBase[k][1]);
          dataPiste[dataBase[k][1]]=dataBase[k][1];
          dataGrandTitre[dataBase[k][2]]=dataBase[k][2];
          dataImage[dataBase[k][3]]=dataBase[k][3];
    	  dataMiniature[dataBase[k][4]]=dataBase[k][4];
    	 
    	
    	  
    
    }
    
    
    for(var value in dataImage){
    
    //alert(value+"="+dataImage[value]);
    
    
    
    }
    //affiche(dataBase);
    selectGalerie(dataPiste);
    }
     function affiche(dataBase){
    for (var k=0; k<18; k++) {
          //for(var l=0;l<5;l++) {
    
     
     var pointeur=document.getElementById("test"); //création d'un objet élement     
    	var item = document.createElement("img");//création d'un élement img
            item.setAttribute("src",dataBase[k][3]);	
            pointeur.appendChild(item);	
        //var image= item.setAttribute("src","'"+dataBase[k][3]+"'");
    	    //item.appendChild(image);      
       
        
        
    //}
    }
    }
     function afficheIm(dataImage){
    for(var value in dataImage){
          //for(var l=0;l<5;l++) {
    
     
     var pointeur=document.getElementById("test"); //création d'un objet élement     
    	var item = document.createElement("img");//création d'un élement img
            item.setAttribute("src",dataImage[value]);	
            pointeur.appendChild(item);	
        //var image= item.setAttribute("src","'"+dataBase[k][3]+"'");
    	    //item.appendChild(image);      
       
        
        
    //}
    }
    
    }  
    function selectGalerie(dataPiste){
    
    
    /*for(var value in dataPiste){
    var exRegSelect=new RegExp(dataPiste[value],"g");  
    var chaine=dataPiste[value].match(exReg).toString();
    }*/
    TabPisteIndice=new Array();
    
    var indice=0;
    for(var value in dataImage){
    indice++;
    TabPisteIndice[indice]=dataPiste[value];
    var pointeur=document.getElementById("test");//ici code XHTML avec innetHTML
    alert(value);
    
    }
    
    
    }
    function rqSent(state){
    
    var str1 ="requête envoyée le status est :"+state;
    return str1;
    }
    function waitRq(state){
    var str2 ="Réponse en cours de réception...le status est :"+state;
    return str2
    } 
    
    function response(state){
    
    var str3 ="Réponse est :"+xmlhttp.responseText+" le status est :"+state;	
    return str3
    
    }
    function init(){
    exReq();
    }
    newtimer = setTimeout("init()",1000);
    Voilà c'est un brouillon j'aurais du faire l'algo surement
    là je le refais en orienté objet
    Donc le code fautif c'est en gras
    le but du script une connexion à un script php qui fait une simple requête select
    ajax récupère les données dans une grande chaine de caractère
    qui est traitée dans une RegExp en gros ensuite le but est de récupérer les données faire des tableaux pour afficher tout ça
    j'aurais pu utiliser XML Jason
    mais en faisant ça ça me fait travailler pas mal de truc et c'est le but
    je fais rarement du js
    Merci

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var indice=0;
    for(var value in dataImage){
    indice++;
    TabPisteIndice[indice]=dataPiste[value];
    var pointeur=document.getElementById("test");//ici code XHTML avec innetHTML
    alert(value);
     
    }
    1° remarque : nomme ta variable autrement que "value" : c'est un mot réservé du langage.
    Ensuite, c'est quoi, "dataImage" ? (pas déclaré ni en paramètre)
    Enlève le "pointeur" car il ne sert à rien. En plus on ne fait pas de déclaration (var) dans une boucle : multidéclaration = erreur.
    Enfin : tu as combien d'entrées dans ton array() et combien de fois vois-tu l'alert() ?

    Mais je comprends pas bien ta gestion des indices de tableaux : quel est le but ?

    A+

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Merci
    d'accord pour le var
    sinon var dataImage=new Array(); donc déclaré ligne 87 est un tableau d'url d'image mais dans le bloc de code qui pose soucis c'est dataPiste ,j'ai testé dataImage ensuite qui contient 18 valeurs differentes 18 string differents
    alors que dataPiste contient 18 valeurs mais en realité que 2 chaines differentes
    Je crois que for in est anti doublons ce qui pose probleme si on veut récupérer toutes les valeurs d'un tableau associatatif dans un tableau indicé
    Pourquoi un tableau indicé?
    c'est juste que c'est plus facilement manipulable et j'avais besoin de la valeur de la cléf
    mais j'aurais du faire l'algo
    le js procédural me sert de brouillon et d'algorythmique....

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Déjà, les tableaux associatifs n'existent pas en JavaScript. Tu ne peux utiliser que des structures d'objet.
    Ensuite, si tu affectes deux fois une propriété à un objet, la première affectation est ecrasée par la seconde, ce qui explique à priori
    que for in est anti doublons
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    c'était donc ça .....
    Je te crois quand tu dis que les tableaux associatifs n'existent pas en JavaScript
    mais alors pourquoi lire dans ma dizaine de livre" les tableaux associatifs en JavaScript"? c'est un abus de langage....
    De la même manière un objet n'existe pas en JavaScript puisque c'est toujours un tableau.Cela dit même en java une arrayList en interne est toujours un tableau...
    Donc créer un tableau associatif revient à créer un objet cela dit voilà pour quoi une boucle for in.... c'est logique !

    Merci bien


    Edit :je viens de lire qu'un tableau associatif est un objet unique ou l'on peut ajouter des methodes et attributs chaque valeur peut etre interprétée comme une instruction grâce à eval
    JavaScript est un drôle de langage mais c'est passionnant...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Petite question subsidiaire j'ai un doute
    un constructeur en javaScript

    function constructObject(param){
    this.param=param;
    ici si je veux créer une propriété qui n'est pas un paramètre du constructeur

    ça sera
    this.pro=pro= une valeur ou une fonction .....ou null

    si j'ecris
    this.pro ou simplement pro ça marche aussi?

    this designe l'objet courant
    la définition d'une propriété this.pro =quelque chose n'est pas suffisante?


    Merci



    }

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par laurentg2003 Voir le message
    mais alors pourquoi lire dans ma dizaine de livre" les tableaux associatifs en JavaScript"? c'est un abus de langage....
    De la même manière un objet n'existe pas en JavaScript puisque c'est toujours un tableau.
    Malheureusement, des livres francophones rigoureux au niveau des concepts, c'est très rare.
    Donc oui, parler de tableau associatif en JavaScript est un abus de langage qui est dû au fait qu'en réalité un Array en JavaScript est un Object particulier comme le montre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var test=[0, 1, 2];
    alert(typeof test);
    et qu'accéder aux membres d'un Array ou d'un Object est assez similaire.
    Mais ceci resterait du domaine du chipotage sémantique s'il n'existait pas de réelles différences entre un Array et un Object, à savoir que Array augmente le prototype de Object avec certaines méthodes et propriétés (en particulier length) qui distinguent fortement les deux.

    Ensuite, je ne te suis pas quand tu dis qu'un objet n'existe pas en JavaScript. Au contraire, tout est objet en JavaScript, au point même que contrairement aux idées reçues, il n'existe pas d'environnement global mais un objet englobant (window dans le cadre d'une page HTML) dont héritent tous les autres objets.
    Citation Envoyé par laurentg2003 Voir le message
    JavaScript est un drôle de langage mais c'est passionnant...
    Voilà, tu viens de découvrir tout l'attrait de JavaScript
    Citation Envoyé par laurentg2003 Voir le message
    Petite question subsidiaire j'ai un doute
    un constructeur en javaScript

    function constructObject(param){
    this.param=param;
    ici si je veux créer une propriété qui n'est pas un paramètre du constructeur

    ça sera
    this.pro=pro= une valeur ou une fonction .....ou null

    si j'ecris
    this.pro ou simplement pro ça marche aussi?

    this designe l'objet courant
    la définition d'une propriété this.pro =quelque chose n'est pas suffisante?
    L'exemple que tu donnes est celui d'une fonction anonyme, donc oui, pour reprendre tes termes, this.pro et pro sont équivalents puisque tu ne peux pas accéder au contexte de l'objet en dehors de celui-ci, en revanche, là où la différence se fait est lorsque tu défini ce contexte dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var pro = 'toto'
    var monObjet = function(pro){
        this.pro = pro;
    }
    var antitoto = new monObjet('tata');
    alert(pro+'\n'+antitoto.pro);
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 327
    Par défaut
    Merci beaucoup pour cette exemple
    Pour revenir sur les tableaux associatifs
    Shelley Powers dans "débuter en JavaScript" conseille de ne pas les créer avec le constructeur Array pour éviter la confusion avec les tableaux indicés mais avec new Object();ce qui démontre bien que se sont des objets...
    pour les objets JavaScript j'ai lu que c'est tous des tableaux en fait d'où mes propos
    un tableau associatif est donc un objet qui est un tableau
    bon j'arrette de chipoter
    merci pour tes renseignements
    c'est vrai que JavaScript est un langage atypique c'est ce qui fait son intérêt ,je trouve

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

Discussions similaires

  1. [Yahoo UI] YUI3 + Ajax avec boucle FOR
    Par razorlok dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 27/02/2013, 09h55
  2. [AJAX] Liste liée Ajax dans une boucle For en php
    Par milo1986 dans le forum AJAX
    Réponses: 6
    Dernier message: 23/11/2012, 06h48
  3. [AJAX] boucle for dans item pour l'affichage d'une base de donné
    Par senda dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/03/2009, 13h42
  4. [AJAX] propriété dynamique perdue dans une boucle FOR
    Par spidflinch dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 02/02/2009, 14h01
  5. boucle for pour trier les doublons
    Par gerald57 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2008, 15h40

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