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 :

Undefined : Fonction qui retourne un tableau


Sujet :

JavaScript

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut Undefined : Fonction qui retourne un tableau
    Bonjour,

    J'essaye de retourner un tableau, mais dans la console de debug, cela m'indique undefined.
    Cà doit être une erreur toute bête mais je ne vois pas comment la corriger.

    J'ai donc une fonction récursive qui me recherche dans un tableau un noeud et dés qu'il le trouve il me le retourne.
    Fonction de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function RechercheNoeud(indicateurParent, id){
        if(indicateurParent){
            $.each(indicateurParent['indicateurSuivant'], function (key, enfant){
                if(enfant['id'] === id){
    console.debug(enfant);
                    return enfant;
                } else {
                    RechercheNoeud(enfant, id);
                }
            });
     
        } else return null;
    }
    Mon Debug m'indique bien qu'il a trouvé mon noeud.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ({id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, indicateurSuivant:[]}]}]})
    Fonction qui appelle RechercheNoeud
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function DescendreIndicateur(key, idParent){
        alert(idParent);
        var idSecteur=tabStatistique[key]['id'];
    console.debug(tabStatistique[key]);
        var indicateurParent = RechercheNoeud(tabStatistique[key], idParent);
    console.debug(indicateurParent);
        if(indicateurParent !== null){
            $("#tab2_" + idSecteur).remove();
            var newElementTab2=ChargementDivContenu(indicateurParent, idSecteur, key, 0, false);    
     
            $("#div4_" + idSecteur).append(newElementTab2);
        }
    }
    Le premier debug m'affiche mon tableau que je recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ({id:1, libelle:"Action sociale", indicateurSuivant:[{id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, indicateurSuivant:[]}]}]}, {id:27, libelle:"Indicateur 1 n2", valeur:1, poids:1, evolution:1, indicateurSuivant:[]}, {id:28, libelle:"Indicateur 1 n3", valeur:1, poids:1, evolution:-1, indicateurSuivant:[{id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, indicateurSuivant:[]}]}, {id:29, libelle:"Indicateur 1 n4", valeur:0, poids:1, evolution:0, indicateurSuivant:[]}, {id:30, libelle:"Indicateur 1 n5", valeur:0, poids:1, evolution:0, indicateurSuivant:[]}, {id:31, libelle:"Indicateur 1 n6", valeur:1, poids:1, evolution:0, indicateurSuivant:[]}]})
    Le deuxieme le résultat UNDEFINED

    Avez vous une idée svp?

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else {
       RechercheNoeud(enfant, id);
    }
    Ce ne serait pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    else {
       return RechercheNoeud(enfant, id);
    }

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Sans le return la fonction fonctionne, je viens de tester avec mais je ne vois aucun changement.
    A tester sur l'id suivant de mon tableau car la il ne fait pas d'appel recursive avec l'id=1.

    Par contre je viens de trouver un début de solution, une erreur toute conne.
    Comme j'utilise Jquery, il faut que je face un var monTab = $.each(...) et retourner la variable monTab.
    Mais ca ne marche toujours pas

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ce n'est pas parce que tes messages de debug apparaissent que la fonction fonctionne. Il faut faire remonter le résultat au cycle parent, c'est une base de la récursivité.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Si tu fais un return, la fonction récursive ne s'arrête pas et transmet pas le résultat à la fonction qui l'a appelé?

    En Php ca fonctionne ainsi.

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Bon j'ai finalement trouvé, une bonne nuit de sommeil ca remet les idées en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function RechercheNoeud(indicateurParent, id){
        if(indicateurParent){
            var enfant1 = [];
            $.each(indicateurParent['indicateurSuivant'], function (key, enfant){
                if(enfant['id'] === id){
                    enfant1 = enfant;
                } else {
                    RechercheNoeud(enfant, id);
                }
            });
            return enfant1;
        } else return false;
    }

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Je rencontre une autre anomalie que je ne m'explique pas avec le code ci-dessous.

    Pourquoi dans mon debug il m'affiche plusieurs return? Est ce normal? voir l'exemple.

    Ma fonction
    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 RechercheNoeudParent(noeud, idEnfant){
        if(noeud instanceof Object){
            var noeud1 = [];
            $.each(noeud['indicateurSuivant'], function (key, enfant){
                //console.debug(enfant);
                if(enfant['id'] === idEnfant){
                    noeud1 = noeud;
                    return false;
                } else {
                    RechercheNoeudParent(enfant, idEnfant);
                }
            });
    console.debug(noeud);
            return noeud;
        } else return false;
    }
    Ma Console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [09:47:07,540] 12
    [09:47:07,540] ({id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]})
    [09:47:07,540] ({id:27, libelle:"Indicateur 1 n2", valeur:1, poids:1, evolution:1, niveau:1, indicateurSuivant:[]})
    [09:47:07,540] ({id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]})
    [09:47:07,540] ({id:28, libelle:"Indicateur 1 n3", valeur:1, poids:1, evolution:-1, niveau:1, indicateurSuivant:[{id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}]})
    [09:47:07,540] ({id:29, libelle:"Indicateur 1 n4", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]})
    [09:47:07,541] ({id:30, libelle:"Indicateur 1 n5", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]})
    [09:47:07,541] ({id:31, libelle:"Indicateur 1 n6", valeur:1, poids:1, evolution:0, niveau:1, indicateurSuivant:[]})
    [09:47:07,541] ({id:1, libelle:"Action sociale", niveau:0, indicateurSuivant:[{id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]}, {id:27, libelle:"Indicateur 1 n2", valeur:1, poids:1, evolution:1, niveau:1, indicateurSuivant:[]}, {id:28, libelle:"Indicateur 1 n3", valeur:1, poids:1, evolution:-1, niveau:1, indicateurSuivant:[{id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}]}, {id:29, libelle:"Indicateur 1 n4", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:30, libelle:"Indicateur 1 n5", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:31, libelle:"Indicateur 1 n6", valeur:1, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}]})

  8. #8
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je ne vois pas comment ça peut marcher puisque tu ne fais rien du résultat de l'appel récursif

    Les logs sont normaux, ils te montrent le parcours récursif. Mais ce ne sont que des logs, c'est la valeur de retour de la fonction que tu dois utiliser. Il faut que tu revois les bases de la récursivité, ou alors que tu t'en passes pour cet exemple ci étant donné qu'une boucle for fait tout aussi bien.

    Si j'ai bien compris ce que tu essaies de faire, voilà un code récursif qui pourrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function RechercheNoeudParent(noeud, idEnfant){    
        if(noeud instanceof Object && Array.isArray(noeud['indicateurSuivant'])){
            for(var i=0; i < noeud['indicateurSuivant'].length; i++){
                if(noeud['indicateurSuivant'][i]['id'] === idEnfant){
                    return noeud;
                } else if(RechercheNoeudParent(noeud['indicateurSuivant'][i], idEnfant)){
                    return noeud['indicateurSuivant'][i];
                }
            }        
        }
        return null;
    }

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Ca marche nickel.

    Je pense que mon erreur est de vouloir passer par du jquery.
    J'ai essayer en mettant noeud1 = RechercheNoeudParent(enfant, idEnfant);
    mais cela ne fonctionne pas.

    Par contre je suis curieux de savoir mon erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function RechercheNoeudParent(noeud, idEnfant){
        if(noeud['indicateurSuivant'] instanceof Object){
            var noeud1 = [];
            $.each(noeud['indicateurSuivant'], function (key, enfant){
                if(enfant['id'] === idEnfant){
                    noeud1 = noeud;
                    return false;  //On sort du each
                } else {
                    noeud1 = RechercheNoeudParent(enfant, idEnfant);
                }
            });
                return noeud1;
        } else return false;

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Bon la fonction ne fonctionne pas entierement.
    Si je fait une recherche sur l'élément {id:1, libelle:"Indicateur 1 n1", ..
    ca fonctionne car lorsque l'on appelle la fonction on arrive tout de suite sur la valeur recherché.

    Par contre si j'effectue une recherche sur l'id 32, il me retourne mon tableau d'objet au complet.
    J'ai l'impression que c'est bien le return noeud qui se trouve dans la condition else qui bloque.

    Le code avec des debug pour essayer de comprendre la ou il plante :
    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 RechercheNoeud(noeud, id){
    console.debug('Fonction RechercheNoeud');
    console.debug(noeud);
        if(noeud instanceof Object && Array.isArray(noeud['indicateurSuivant'])){
            for(var i=0; i < noeud['indicateurSuivant'].length; i++){
    console.debug(noeud['indicateurSuivant'][i]);
                if(noeud['indicateurSuivant'][i]['id'] === id){
    console.debug('premier if');
                    return noeud['indicateurSuivant'][i];
                } else if(RechercheNoeud(noeud['indicateurSuivant'][i], id)){
        console.debug('sinon');
                        //RechercheNoeud(noeud['indicateurSuivant'][i], id);
                        return noeud;
                }
            }
        }
    }
    La console :

    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
     
    [13:58:17,981] Fonction Down32
    [13:58:17,981] Fonction RechercheNoeud
    [13:58:17,982] ({id:1, libelle:"Action sociale", niveau:0, indicateurSuivant:[{id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]}, {id:27, libelle:"Indicateur 1 n2", valeur:1, poids:1, evolution:1, niveau:1, indicateurSuivant:[]}, {id:28, libelle:"Indicateur 1 n3", valeur:1, poids:1, evolution:-1, niveau:1, indicateurSuivant:[{id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}]}, {id:29, libelle:"Indicateur 1 n4", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:30, libelle:"Indicateur 1 n5", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:31, libelle:"Indicateur 1 n6", valeur:1, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}]})
    [13:58:17,982] ({id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]})
    [13:58:17,982] Fonction RechercheNoeud
    [13:58:17,982] ({id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]})
    [13:58:17,982] ({id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]})
    [13:58:17,982] Fonction RechercheNoeud
    [13:58:17,982] ({id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]})
    [13:58:17,983] ({id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]})
    [13:58:17,983] premier if
    [13:58:17,983] sinon
    [13:58:17,983] Resultat
    [13:58:17,983] ({id:1, libelle:"Action sociale", niveau:0, indicateurSuivant:[{id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]}, {id:27, libelle:"Indicateur 1 n2", valeur:1, poids:1, evolution:1, niveau:1, indicateurSuivant:[]}, {id:28, libelle:"Indicateur 1 n3", valeur:1, poids:1, evolution:-1, niveau:1, indicateurSuivant:[{id:13, libelle:"Indicateur 3 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}]}, {id:29, libelle:"Indicateur 1 n4", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:30, libelle:"Indicateur 1 n5", valeur:0, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}, {id:31, libelle:"Indicateur 1 n6", valeur:1, poids:1, evolution:0, niveau:1, indicateurSuivant:[]}]})

  11. #11
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je ne comprends pas ta condition else. Si cette fois, le but est de retourner le noeud avec l'ID et non plus le noeud parent, alors j'aurais fait 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
    14
    function RechercheNoeud(noeud, id){
    	if(noeud instanceof Object){
    		if(noeud.id === id){
    			return noeud;
    		} else if (Array.isArray(noeud['indicateurSuivant'])){
    			for(var i=0; i < noeud['indicateurSuivant'].length; i++){
    				if(RechercheNoeud(noeud['indicateurSuivant'][i], id)){
    					return noeud['indicateurSuivant'][i];
    				}
    			}
    		}
    	}
    	return null;
    }

  12. #12
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    J'avais bien testé ainsi mais il me retourne le noeud parent du id=32, celui du id=1.

    Qu'est ce que c'est compliqué la récursivité

  13. #13
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Si ca peut aider voici le déroulement de la fonction.
    D'après ce que j'obtien en debug, j'ai l'impression qu'il me retourne bien une première fois mon noeud mais comme c'est du récursif, les autres appelles m'écrase le return.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [15:26:35,504] Fonction Down id de recherche = 32
    [15:26:35,505] sinon
    [15:26:35,505] trouvé
    [15:26:35,505] 2eme If i=1
    [15:26:35,505] 2eme If i=0
    [15:26:35,505] Resultat
    [15:26:35,505] ({id:1, libelle:"Indicateur 1 n1", valeur:2, poids:1, evolution:0, niveau:1, indicateurSuivant:[{id:12, libelle:"Indicateur 4 n2", valeur:1, poids:1, evolution:null, niveau:2, indicateurSuivant:[]}, {id:32, libelle:"Indicateur 5 n2", valeur:3, poids:1, evolution:null, niveau:2, indicateurSuivant:[{id:33, libelle:"Indicateur 6 n3", valeur:3, poids:2, evolution:null, niveau:3, indicateurSuivant:[]}, {id:34, libelle:"Indicateur 7 n3", valeur:3, poids:1, evolution:null, niveau:3, indicateurSuivant:[]}]}]})
    et la fonction :
    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 RechercheNoeud(noeud, id){
    	if(noeud instanceof Object){
    		if(noeud.id === id && noeud.niveau !== 0){
    console.debug('trouvé');
    			return noeud;
    		} else if (Array.isArray(noeud.indicateurSuivant)){
    console.debug('sinon');
    			for(var i=0; i < noeud.indicateurSuivant.length; i++){
    				if(RechercheNoeud(noeud.indicateurSuivant[i], id)){
    console.debug('2eme If i=' + i);
    					return noeud.indicateurSuivant[i];
    				}
    			}
    		}
    	}
    	return null;
    }

  14. #14
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Oups oui j'ai fait une erreur, il faut retourner le résultat de la recherche. Là ça ne fonctionnait que pour le premier cycle.

    Voilà les fonctions corrigées :

    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
    function RechercheNoeud(noeud, id){
        if(noeud instanceof Object){
            if(noeud.id === id){
                return noeud;
            } else if (Array.isArray(noeud['indicateurSuivant'])){
                for(var i=0; i < noeud['indicateurSuivant'].length; i++){
                    var enfant = RechercheNoeud(noeud['indicateurSuivant'][i], id);
                    if(enfant != null){
                        return enfant;
                    }
                }
            }
        }
        return null;
    }
     
     
    function RechercheNoeudParent(noeud, idEnfant){    
        if(noeud instanceof Object && Array.isArray(noeud['indicateurSuivant'])){
            for(var i=0; i < noeud['indicateurSuivant'].length; i++){
                if(noeud['indicateurSuivant'][i]['id'] === idEnfant){
                    return noeud;
                } else {
                    var enfant = RechercheNoeudParent(noeud['indicateurSuivant'][i], idEnfant);
                    if(enfant != null){
                        return noeud['indicateurSuivant'][i];
                    }
                }
            }        
        }
        return null;
    }

  15. #15
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 135
    Points : 53
    Points
    53
    Par défaut
    Un grand merci de ton aide Sylvain, tu m'as reelement débloqué.

    Ce matin j'aurais du voir si tu avais posté sur le forum, j'y es passé une heure pour trouver la meme solution que toi.
    Cependant une légère erreur c'est glissé dans ton code.

    Dans la fonction RechercheNoeudParent(noeud, idEnfant) il faut faire un return enfant; au lieu du return noeud['indicateurSuivant'][i];

    Encore merci de ton aide.

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

Discussions similaires

  1. [Tableaux] Fonction qui retourne un tableau
    Par benooiit dans le forum Langage
    Réponses: 2
    Dernier message: 05/01/2007, 01h50
  2. Réponses: 6
    Dernier message: 22/09/2006, 18h17
  3. Fonction qui retourne un tableau ou 2 variables ? possible ou non
    Par jiojio dans le forum VB 6 et antérieur
    Réponses: 45
    Dernier message: 05/06/2006, 15h00
  4. [VB] Fonction qui retourne un tableau
    Par ptitsoleil87 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 24/12/2005, 10h52
  5. Fonction qui retourne un tableau
    Par _lara_ dans le forum ASP
    Réponses: 6
    Dernier message: 24/05/2004, 15h06

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