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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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 confirmé
    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
    Points : 545
    Points
    545
    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
    16 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 939
    Points : 44 109
    Points
    44 109
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    16 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 939
    Points : 44 109
    Points
    44 109
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    16 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 939
    Points : 44 109
    Points
    44 109
    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, 07h07
  2. passer un Array Dynamic à une fonction
    Par steph41200 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/07/2012, 01h11
  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, 14h28
  4. Réponses: 3
    Dernier message: 13/02/2009, 21h34

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