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 :

port�e Array: r�cup�rer un array d'une fonction X dans une fonction Y


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux S�vres (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 41
    Par d�faut port�e Array: r�cup�rer un array d'une fonction X dans une fonction Y
    Bonsoir,

    Dans le but de rendre mon script plus propre, j'essaie de comprendre comment utiliser l'array d'une fonction, dans une autre. Je pensais qu'il fallait faire un return array; dans ma function A, et dans ma fonction B faire var array= function A(); Mais j'obtiens un undefined. Je d�bute et je cherche � comprendre.

    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
    function ChercherDoublons(){
    	var nbcsv = document.getElementsByClassName('element').length;
    	var GlobArray=[];
    	for (let csvno = 1; csvno < nbcsv+1; csvno++) {
    		GlobArray['newarray'+csvno]=[];
    		console.log(document.getElementById("csv"+csvno).files);
    		var file = document.getElementById("csv"+csvno).files[0];
    		var reader = new FileReader();
    		reader.addEventListener('load', function(e) {
    			var text = e.target.result;
    			var doublons =['EID1','EID2','EID3','EID4'];
    			//
    			return doublons;
    			//
    		});
    		reader.readAsText(file);
    	}
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    function EcrireDoublons(){
    	var nbcsv = document.getElementsByClassName('element').length;
    	var Doublons=ChercherDoublons();
    	alert("Doublons: " + Doublons);
    }
    Mon alert m'affiche undefined, pas d'autre erreur en log, de toute �vidence je m'y prends mal, quelqu'un pourrait-il m'aider et m'expliquer svp?

  2. #2
    Membre tr�s actif
    Homme Profil pro
    D�veleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veleoppeur Web/Mobile
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Par d�faut
    Bonjour,

    Ta fonction ChercherDoublons ne renvoie pas de valeur, tu as mis le return dans une fonction associ�e au listener.
    Il faut mettre un return au niveau de ta fonction.

  3. #3
    Mod�rateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par d�faut
    Bonjour,
    dans ton morceau de code
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    reader.addEventListener('load', function(e) {
      var text = e.target.result;
      var doublons =['EID1','EID2','EID3','EID4'];
      //
      return doublons;
      //
    });
    il faut bien se rendre compte que la fonction est asynchrone, donc le r�sultat n'est imm�diatement disponible, ton return doublons, retourne nulle part.

    Il te faut mettre � la place la fonction de traitement ou un appel � celle-ci
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    reader.addEventListener('load', function(e) {
      var text = e.target.result;
      var doublons =['EID1','EID2','EID3','EID4'];
      // appel de la fonction
      functionTraitementDonnes();
      // ou mettre le contenu de ta fonction de traitement ici
    });

  4. #4
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux S�vres (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 41
    Par d�faut
    Je ne suis pas sur de bien comprendre, je ne sais donc pas dissocier le listener d'une part, et le traitement d'autre part?
    Comme j'utilises le listener pour lire le contenu d'un CSV, pour plusieurs csv, j'ai plusieurs listener dans une boucle... Et dans le traitement imbriqu� il y a encore des boucles! Ca fonctionne mais �a m'a l'air tr�s confus et pas pro du tout

  5. #5
    Mod�rateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par d�faut
    je ne sais donc pas dissocier le listener d'une part, et le traitement d'autre part?
    ceci n'est pas bien clair pour moi !?!


    j'ai plusieurs listener dans une boucle.
    oui pour chaque reader cr�e tu affectes un listener.


    Et dans le traitement imbriqu� il y a encore des boucles!
    tu fais ce que tu veux dans la fonction, dite callback, ne t�inqui�te pas le moteur JavaScript g�re au mieux les appels de la pile et le reste.


    Ca fonctionne mais �a m'a l'air tr�s confus et pas pro du tout
    Bienvenue dans le monde de l'asynchrone

  6. #6
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2019
    Messages
    41
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux S�vres (Poitou Charente)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : F�vrier 2019
    Messages : 41
    Par d�faut
    En fait non j'ai englob� reader et listener pour chaque �l�ment de ma boucle. Je vais mettre le code complet, attention �a risque de piquer aux yeux
    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
    function ChercheEtTrouve(){
    	var nbcsv = document.getElementsByClassName('element').length;
    	//alert("Nombre de CSV= " + nbcsv);
     
    	var GlobArray=[];
     
    	for (let csvno = 1; csvno < nbcsv+1; csvno++) {
    		GlobArray['newarray'+csvno]=[];
     
    		console.log(document.getElementById("csv"+csvno).files); // list of File objects
    		var file = document.getElementById("csv"+csvno).files[0];
    		var reader = new FileReader();
    		reader.addEventListener('load', function(e) {
    			var text = e.target.result;
    			GlobArray['monarray'+csvno] = text.split("\n");
    			GlobArray['monarray'+csvno].forEach(function(i){
    				var j=i.split(";");
    				var plaque = j[8];
    				if (GlobArray['newarray'+csvno].indexOf(plaque) === -1){//Si la plaque n'existe pas déjà, on l'ajoute
    					GlobArray['newarray'+csvno].push(plaque);
    				}
    				//alert("taille: "+GlobArray['monarray'+csvno].length);
    			});
    			//alert(GlobArray['newarray'+csvno].pop());
    			//alert(GlobArray['monarray'+csvno][8][8]);//affiche la 8ème ligne entière
    			//alert("test plaque:"+lignefull[8]);
     
    			GlobArray['newarray'+csvno].shift();
    			alert("Plaques CSV "+csvno+": "+GlobArray['newarray'+csvno]);
    			var plaquesdoublons = [];//Liste complète des plaques doublons
    			var plaquessansdoublons = [];//Liste complète des plaques sans doublons
     
    			for (let csvno = 1; csvno < nbcsv+1; csvno++) {
    				GlobArray['newarray'+csvno].forEach(function(i){
    					var plaque = i;
    					if (plaquessansdoublons.indexOf(plaque) === -1){
    						plaquessansdoublons.push(plaque);
    					}
    					else{
    						if (plaquesdoublons.indexOf(plaque) === -1){
    							plaquesdoublons.push(plaque);
    						}
    					}
    				});
    			}
     
    			alert("plaques sans doublons: " + plaquessansdoublons);
    			alert("plaques doublons: " + plaquesdoublons);
    			//
    			//return plaquesdoublons;
    			//
    			var veriftable = document.getElementById("resultats");
    			if(veriftable == null){
    				var tableauresultats = document.createElement('table');// Création du tableau des résultats
    				tableauresultats.setAttribute('id','resultats');
    				document.body.appendChild(tableauresultats);
    			}
     
    			var verifentetes = document.getElementById("entetes");
    			if(verifentetes == null){
    				var tableauentetes = document.createElement('tr');
    				tableauentetes.setAttribute('id','entetes');
    				document.getElementById('resultats').appendChild(tableauentetes);// Création ligne entetes
    			}
    	//alert("Nombre de colonnes: "+document.getElementById('entetes').children.length);
    			for (let j = document.getElementById('entetes').children.length; j < nbcsv+1; j++) {
    				var col = document.createElement('th');
    				document.getElementById('entetes').appendChild(col);//pour chaque ligne, ajout d'une colonne en fonction du nombre de csv (+1)
    				if (j===0){
    					document.getElementById('entetes').children[j].innerHTML = "Plaques";
    				}
    				else {
    					document.getElementById('entetes').children[j].innerHTML = "CSV"+j;
    				}
     
    			}
     
    			var a = 0;
    			plaquesdoublons.forEach(function(i){
    				var plaque = i;
    				a++;
    				var verifentetes = document.getElementById("resultat"+a);
    				if(verifentetes == null){
    					var Resultat = document.createElement('tr');//Ajout d'une ligne par plaque doublon
    					Resultat.setAttribute('id', 'resultat'+a);
    					document.getElementById('resultats').appendChild(Resultat);
    				}
     
    				for (let j = document.getElementById('resultat'+a).children.length; j < nbcsv+1; j++) {
    					document.getElementById('resultat'+a).appendChild(document.createElement('td'));//pour chaque ligne, ajout d'une colonne en fonction du nombre de csv (+1)
    					if (j===0){
    						document.getElementById('resultat'+a).children[j].innerHTML = plaque;
    					}
    					else {
    						if (GlobArray['newarray'+j].indexOf(plaque) === -1){
    							document.getElementById('resultat'+a).children[j].innerHTML = "False";
    						}
    						else{
    							document.getElementById('resultat'+a).children[j].innerHTML = "True";
    						}
    					}
    				}
    			});
    			//
     
    		});
    		reader.readAsText(file);
     
    	}

  7. #7
    Mod�rateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 211
    Par d�faut
    attention �a risque de piquer aux yeux
    ce qui pique les yeux c'est surtout que ton code est difficile � lire.

    Peut-�tre devrais-tu � morceller � ton code en sous-fonction, tu gagnerais en clart�.

    Il te faut �galement penser � mettre en � cache � les �l�ments que tu utilises souvent, par exemple :document.getElementById('entetes') que l'on retrouve 5 fois dans ton code.

    Mais si cela fonctionne c'est bien le principal

Discussions similaires

  1. [MySQL] Retourner un array d'une fonction et l'utiliser
    Par andaman dans le forum PHP & Base de donn�es
    R�ponses: 2
    Dernier message: 18/10/2013, 06h07
  2. passer un Array Dynamic � une fonction
    Par steph41200 dans le forum D�buter
    R�ponses: 3
    Dernier message: 09/07/2012, 00h11
  3. [JavaScript] [SRC] array_map() modification de tous les elements d'un array avec une fonction
    Par SpaceFrog dans le forum Contribuez
    R�ponses: 0
    Dernier message: 08/07/2009, 13h28
  4. R�ponses: 3
    Dernier message: 13/02/2009, 20h34

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