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 :

Parcours tableau avec sous-tableaux


Sujet :

JavaScript

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut Parcours tableau avec sous-tableaux
    Bonjour,

    J'aimerais parcourir un tableau qui m'est donné sous la forme suivante par un programme PL/SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [["9226 mesure ECOOL f",0,
     ["9227 mesure ECOOL f",0,
      ["9240 TD62 - Tracés au sol f"],
      ["10872 mesure ECOOL t",0,
       ["10873 mesure ECOOL t"]
      ],
     ],
     ["9228 TD68 f",0,
      ["9241 TD68 - Tracés au sol t"],
      ["10905 mesure ECOOL t",0,
       ["10906 mesure ECOOL t"]
      ]
     ]
    ]]
    Ce tableau représente un arbre, les éléments suivi d'un 0 étant les noeuds.

    J'aimerais retirer tous les éléments qui se terminent par ' f' (en enlevant en plus le 0 si c'est un noeud).

    Par exemple avec le tableau ci-dessus je pense qu'on devrais obtenir ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [
     ["10872 mesure ECOOL t",0,
      ["10873 mesure ECOOL t"]
     ],
     ["9241 TD68 - Tracés au sol t"],
     ["10905 mesure ECOOL t",0,
      ["10906 mesure ECOOL t"]
     ]
    ]
    J'ai essayer diverses choses, notamment en fonctions récursives mais j'ai vraiment du mal, une petite aide serait la bienvenue

    Merci.

  2. #2
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Peux-tu nous montrer ce que tu as essayé?

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Salut,

    J'ai laissé tout le code au bureau.
    Je poste ça demain matin à la première heure.

    Mais SpaceFrog m'a fait un truc pas mal juste après sur le chat, ça fonctionne presque, ya juste 2/3 trucs que je n'arrive pas à règler.

    On vois ça demain !

    Merci

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Le code ®SpaceFrog un poil modifié :

    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 recur(arr){
    	this.k=0;
    	for(elt in arr){
    		if (typeof arr[this.k] == "string") { 
    			if (/ f$/.test(arr[this.k])){
    				alert(arr[this.k]);
    				arr.splice(this.k,1);
    				/*if (arr[this.k] == 0)
    					arr.splice(this.k,1);*/
    			}
    		}
    		else {
    			new recur(arr[this.k]);     
    		}
    		this.k++;
    	}
    }
    Le code en commentaire c'est pour enlever le 0 qui suit si c'est un noeud.

    Le alert m'affiche bien un à un tous les éléments finissant par ' f', donc il devrait bien les retirer mais apparement le splice ne fonctionne pas comme je pense...

    Le tableau avant traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    9226 mesure ECOOL f,0,9227 mesure ECOOL f,0,9240 TD62 - Tracés au sol f,10872 mesure ECOOL t,0,10873 mesure ECOOL t,9228 TD68 f,0,9241 TD68 - Tracés au sol t,10905 mesure ECOOL t,0,10906 mesure ECOOL t
    Le tableau après traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0,0,,10872 mesure ECOOL t,0,10873 mesure ECOOL t,0,9241 TD68 - Tracés au sol t,10905 mesure ECOOL t,0,10906 mesure ECOOL t
    D'ailleurs lorsque j'affiche les tableaux remarquez que je perd la hiérarchie, il affiche juste les éléments séparés par des virgules.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Bon je dois vraiment être bête, je ne m'en sort pas

    un fichier de test :

    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
    var gReturn = '[["9226 mesure ECOOL f",0,["9227 mesure ECOOL f",0,["9240 TD62 - Tracés au sol f"],["10872 mesure ECOOL t",0,["10873 mesure ECOOL t"]],],["9228 TD68 f",0,["9241 TD68 - Tracés au sol t"],["10905 mesure ECOOL t",0,["10906 mesure ECOOL t"]]]]]';
    var TREE_ITEMS = eval(gReturn);
    alert(TREE_ITEMS);
    recur(TREE_ITEMS);
    alert(TREE_ITEMS);
     
    function recur(arr){
    	for(var k=0;k<arr.length;k++){
    		if (typeof arr[k] == "string") { 		
    			if (arr[k].substr(arr[k].length-2,2) == ' f') {
    				arr.splice(k,1);
    				/*if (arr[k] == 0) {
    					arr.splice(k,1);
    				}*/
    			}
    		}
    		else {
    			new recur(arr[k]); 
    		}
    	}
    }
    A l'aide d'une fonction var_dump pour afficher le tableau (merci supersnail ) j'obtient :

    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
    Array => [
        0: Array => [    
            0: Other: 0
            1: Array => [        
                0: Other: 0
                1: Array => [            
                ]
                2: Array => [            
                    0: String: "10872 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10873 mesure ECOOL t"
                    ]
                ]
            ]
            2: Array => [        
                0: Other: 0
                1: Array => [            
                    0: String: "9241 TD68 - Tracés au sol t"
                ]
                2: Array => [            
                    0: String: "10905 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10906 mesure ECOOL t"
                    ]
                ]
            ]
        ]
    ]
    Ce qui est normal (les valeurs finissant par f sont bien supprimées), il faut juste que je supprime les tableaux vides, mais comment faire ? => trouvé

    Par contre si je décommente le if dans la fonction (pour supprimer le 0), j'obtiens :

    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
    Array => [
        0: Array => [    
            0: Array => [        
                0: String: "9227 mesure ECOOL f"
                1: Other: 0
                2: Array => [            
                    0: String: "9240 TD62 - Tracés au sol f"
                ]
                3: Array => [            
                    0: String: "10872 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10873 mesure ECOOL t"
                    ]
                ]
            ]
            1: Array => [        
                0: Array => [            
                    0: String: "9241 TD68 - Tracés au sol t"
                ]
                1: Array => [            
                    0: String: "10905 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10906 mesure ECOOL t"
                    ]
                ]
            ]
        ]
    ]
    Donc là ca fait n'importe quoi, il reste des valeurs finissant par f, même si les 0 correspondant aux 2 valeurs qui n'apparaissent pas sont bien supprimés.

    Si vous avez une idée. Merci.

    EDIT : OK j'arrive à supprimer les tableaux vides en ajoutant simplement ceci à la fonction après l'appel récursif :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (arr[k].length == 0) {
    	arr.splice(k,1);
    }

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Ca y est, en ajoutant dans le ça semble fonctionner, ne me demandez pas pourquoi

    Mais dans tous les cas mon script qui construit correctement l'arbre lorsqu'il n'est pas filtré, n'arrive pas à le construire après ce traitement. La structure obtenue doit être mauvaise (sûrement à cause des array imbriqués), par exemple maintenant j'obtiens ç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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Array => [
        0: Array => [    
            0: Array => [        
                0: Array => [            
                    0: String: "10872 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10873 mesure ECOOL t"
                    ]
                ]
            ]
            1: Array => [        
                0: Array => [            
                    0: String: "9241 TD68 - Tracés au sol t"
                ]
                1: Array => [            
                    0: String: "10905 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10906 mesure ECOOL t"
                    ]
                ]
            ]
        ]
    ]
    Il y a des array inutiles, je pense que c'est la cause.

    Bref j'y reviendrai plus tard quand j'aurai plus de temps car là il faut que j'avance sur d'autres choses. Merci à ceux qui m'ont aidé (SpaceFrog et supersnail).

    à+ !

  7. #7
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    Tu peux nous montrer le code modifié s'il te plaît?

  8. #8
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Salut,

    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
     
    var gReturn = '[["9226 mesure ECOOL f",0,["9227 mesure ECOOL f",0,["9240 TD62 - Tracés au sol f"],["10872 mesure ECOOL t",0,["10873 mesure ECOOL t"]],],["9228 TD68 f",0,["9241 TD68 - Tracés au sol t"],["10905 mesure ECOOL t",0,["10906 mesure ECOOL t"]]]]]';
    var TREE_ITEMS = eval(gReturn);
    alert(TREE_ITEMS);
    recur(TREE_ITEMS);
    alert(TREE_ITEMS);
     
    function recur(arr){
    	for(var k=0;k<arr.length;k++){
    		if (typeof arr[k] == "string") { 		
    			if (/ f$/.test(arr[k])) {
    				arr.splice(k,1);
    				if (arr[k] == 0) 
    					arr.splice(k--,1);
    			}
    		}
    		else {
    			new recur(arr[k]); 
    			if (arr[k].length == 0) 
    				arr.splice(k,1);
    		}
    	}
    }
    Ca fonctionne parfaitement, il reste juste des array en trop (inutiles), c'est ce que mon script qui construit l'arbre semble ne pas aimer.


    EDIT :

    Par exemple la sortie obtenue :
    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
    Array => [
        0: Array => [    
            0: Array => [        
                0: Array => [            
                    0: String: "10872 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10873 mesure ECOOL t"
                    ]
                ]
            ]
            1: Array => [        
                0: Array => [            
                    0: String: "9241 TD68 - Tracés au sol t"
                ]
                1: Array => [            
                    0: String: "10905 mesure ECOOL t"
                    1: Other: 0
                    2: Array => [                
                        0: String: "10906 mesure ECOOL t"
                    ]
                ]
            ]
        ]
    ]
    correspond à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '[[[["10872 mesure ECOOL t",0,["10873 mesure ECOOL t"]]],[["9241 TD68 - Tracés au sol t"],["10905 mesure ECOOL t",0,["10906 mesure ECOOL t"]]]]]'
    Alors qu'il faudrait que ça retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '[["10872 mesure ECOOL t",0,["10873 mesure ECOOL t"]],["9241 TD68 - Traces au sol t"],["10905 mesure ECOOL t",0,["10906 mesure ECOOL t"]]]'
    J'ai testé manuellement et c'est bien ça le problème apparement.

  9. #9
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Essaie peut-être de faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                   if (typeof arr[k] == "string") { 		
    			if (/ f$/.test(arr[k])) {
                                   if (arr[k+1] == 0) 
    					arr.splice(k+1,1);
    				arr.splice(k,1);
     
    			}
    		}
    En gros, si le tableau se finit par un "f", je regarde si l'élément suivant est un zéro. Si c'est le cas je le supprime, avant de supprimer l'élément actuel.

    Bref: essaie ça,et dis-moi si ça marche

  10. #10
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    J'ai reglé le problème des 0, mon code fonctionne (et le tient aussi sûrement!)

    Il me reste plus qu'a supprimer ces tableaux en trop.

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Bonjour,

    J'ai un doute quand à la méthode utilisée pour "nettoyer" l'arbre...

    En effet, si j'ai bien compris, la suppression d'un noeud n'entraîne pas la disparition de ses enfants mais ils deviennent enfants du père du noeud supprimé.

    Il faudrait donc créer l'arbre "réponse" lors du parcours de l'arbre initial.


    devyan

  12. #12
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Oui voilà c'est ça.

    C'est en fait un filtrage d'arbre, n'importe quelle valeur peut être supprimée, et il faut que l'arbre reste "constructible".

    Tu veux dire recréer un tableau au fur et à mesure du parcours, avec des push(), etc... ? Je trouve ça plus compliqué moi non, dans le cas d'un tableau simple d'accord, mais là c'est récursif, c'est pour ça que je n'y arrive pas d'ailleurs je ne suis pas fait pour la recurtivi... récurvisit... tu vois !

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 132
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 132
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par Yann39 Voir le message
    Oui voilà c'est ça.

    C'est en fait un filtrage d'arbre, n'importe quelle valeur peut être supprimée, et il faut que l'arbre reste "constructible".

    Tu veux dire recréer un tableau au fur et à mesure du parcours, avec des push(), etc... ? Je trouve ça plus compliqué moi non, dans le cas d'un tableau simple d'accord, mais là c'est récursif, c'est pour ça que je n'y arrive pas d'ailleurs je ne suis pas fait pour la recurtivi... récurvisit... tu vois !
    Plus compliqué je ne sais pas mais plus faisable, à mon avis oui (mais ce n'est que mon avis et je le partage)

    Ta demande ne correspond pas à un élagage simple mais à réaliser des couper/coller dans ton arbre.

  14. #14
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Sinon je pourrais directement modifier ma petite fonction PL/SQL qui génère le tableau, mais j'ai déja passer plus d'une journée entière sans succès, alors j'avais laissé tombé.

    Peut-être devrais-je faire un post dans la section PL/SQL.

Discussions similaires

  1. Découpage d'un tableau en sous tableaux
    Par ivan-dev dans le forum Langage
    Réponses: 1
    Dernier message: 23/12/2010, 16h22
  2. Tableau avec sous-totaux dans Rave Report
    Par jackvpt dans le forum Rave
    Réponses: 4
    Dernier message: 21/12/2010, 23h53
  3. Creer un 3ème tableau avec 2 tableaux
    Par anxious dans le forum Langage
    Réponses: 10
    Dernier message: 10/12/2009, 18h00
  4. Réponses: 4
    Dernier message: 31/07/2008, 14h39
  5. [Tableaux] Diviser un tableau en sous-tableaux
    Par fayred dans le forum Langage
    Réponses: 5
    Dernier message: 18/03/2008, 16h56

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