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 :

Copier un tableau associatif


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut Copier un tableau associatif
    Bonjour,

    mon problème est dans le titre!

    J'ai un tableau js à 2 dimensions et associatifs, ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    monTab["papa"]["maman_1"] = "bébé_1";
    monTab["papa"]["maman_2"] = "bébé_2";
    ...
    (Désolé pour exemple un peu trop expressif !).

    Bref, j'aimerai faire une copie profonde de ce tableau mais je ne trouve pas d'autre solution que de passer par 2 boucles for in imbriquées, solution beaucoup trop couteuse en ressource...

    Auriez-vous une solution stable et performante à me proposer?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Hello,

    As tu réellement besoin de copier?
    Sinon je connais pas d'autre moyen que de recopier les propriétés à la main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var prop;
     
    for (prop in obj) {
       obj2[prop] = obj[prop] /* + ton code ici pour copier la valeur si la valeur est un objet ou tableau */;
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Merci pour ta réponse.

    Ne peut-on pas utiliser la même méthode que la copie d'un objet? (méthode que je ne connais d'ailleurs pas mais qui existe me semble t-il..)

    Sinon je crois qu'il falloir revoir ma façon de faire pour arriver à mes fins, car malheureusement, j'ai bel et bien besoin de cette copie...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Tu trouveras pas mal d'exemple de clonage d'objet sur la grande toile.
    Les fonctions clone()

    Ca devrait fonctionner pour ton cas. Il faut que tu test.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos reponses

    Concernant la fonction clone(), je n'ai pas trouvé cette fonction en natif dans javascript... Existe t-elle?

    Sinon j'aurai une autre question : si je veux supprimer un element de mon tableau js associatifs à 2 dimensions, je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete (monTab["papa_1"]["maman_1"]);
    Le probleme c'est que quand je compte le nombre de papas avant suppression et apres suppression, sa reste le même nombre!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var cpt = 0;
    for (var papa in monTab)
    { 
       cpt++;
    }
    alert("cpt = "+cpt);

    Quelqu'un a une idée pourquoi?

  6. #6
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par benthebest Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete (monTab["papa_1"]["maman_1"]);
    Là tu ne supprimes que la propriété "maman_1" de monTab["papa_1"]
    Si tu veux supprimer la propriété "papa_1"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete (monTab["papa_1"]);

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Oui mais c'est justement cela que je veux supprimer, juste le "maman_1" ... et le probleme c'est qu'elle apparait toujours dans ma boucle meme apres l'avoir supprimé!

  8. #8
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Mais ta boucle parcourait les propriétés de monTab, pas les propriétés de monTab['papa_1']

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Bon alors je dois m'embrouiller les pinceaux avec ces histoires...

    ok je repete mon souhait avec un exemple peut-etre plus concret:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    monTab["papa_1"]["maman_1"] = "ils s'aiment beaucoup";
    monTab["papa_1"]["maman_2"] = "ils s'aiment passionement";
    monTab["papa_1"]["maman_3"] = "ils ne s'aiment pas";
     
    monTab["papa_2"]["maman_1"] = "ils ne s'aiment pas";
    (lol pour l'exemple)


    Bref, donc moi disons que je veux supprimer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monTab["papa_2"]["maman_1"] = "ils s'aiment beaucoup";
    Je dois donc utiliser (selon moi):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete monTab["papa_2"]["maman_1"];
    et ca devrai me renvoyer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    monTab["papa_1"]["maman_1"] = "ils s'aiment beaucoup";
    monTab["papa_1"]["maman_2"] = "ils s'aiment passionement";
    monTab["papa_1"]["maman_3"] = "ils ne s'aiment pas";
    Bon moi maintenant, je cherche a connaitre l'ensemble des papas qu'il reste (donc normalement ke "papa_1"), donc je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var cpt = 0;
    for(var papa in monTab)
       alert(papa);
    Cela me renvoi malgre tout papa_1 et papa_2 !!

    ps , voici un petit code tout pret
    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
     
    monTab = new Object();
    monTab["papa_1"] = new Object();
    monTab["papa_1"]["maman_1"] = "ils s'aiment beaucoup";
    monTab["papa_1"]["maman_2"] = "ils s'aiment passionement";
    monTab["papa_1"]["maman_3"] = "ils ne s'aiment pas";
    monTab["papa_2"] = new Object();
    monTab["papa_2"]["maman_1"] = "ils ne s'aiment pas";
     
    for (var papa in monTab)
    	alert("avant : "+papa);
     
    delete monTab["papa_2"]["maman_1"];
     
    for (var papa in monTab)
    	alert("apres : "+papa);

  10. #10
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Oui c'est normal, la propriété 'papa_2' existe toujours en supprimant la propriété 'maman_1' de l'objet référencé par la propriété 'papa_2'.

    monTab['papa_2'] reference ensuite un objet vide (puisque la seule propriété qu'il y avait a été supprimée) mais monTab a toujours une propriété 'papa_2'

    Note : on peut utiliser la notation obj.propriete si le nom de propriété n'a pas besoin d'être dynamique

  11. #11
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    PS :
    Installe Firebug, fais un console.info(taVariable); et tu y verras plus clair (et vire les alert() par la meme occaz)

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par benthebest Voir le message
    Concernant la fonction clone(), je n'ai pas trouvé cette fonction en natif dans javascript... Existe t-elle?
    Pas à ma connaissance.
    C'est du spécifique que tu devras intégrer dans ta source.

    Pour ton tableau, si tu veux il a cette forme (devant, le niveau) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    0 - monTab = []
    1 - monTab["papa_1"] = []
    2 - monTab["papa_1"]["maman_1"] = ""
    2 - monTab["papa_1"]["maman_2"] = ""
    2 - monTab["papa_1"]["maman_3"] = ""
    1 - monTab["papa_2"] = []
    2 - monTab["papa_2"]["maman_1"] = ""
    (Bien qu'en fait, "papa_" "maman_" soit des propriétés de l'Objet de type Array)

  13. #13
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par kernelfailure Voir le message
    (Bien qu'en fait, "papa_" "maman_" soit des propriétés de l'Objet de type Array)
    Houla, pas bon de faire ça, quand on veut faire des dictionnaires (comme les tableaux associatifs PHP) en javascript on utilise des objets, des objets créés par "new Object()" ou "{ }"

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Houla, pas bon de faire ça, quand on veut faire des dictionnaires (comme les tableaux associatifs PHP) en javascript on utilise des objets, des objets créés par "new Object()" ou "{ }"


    Mon intention était, dans l'exemple, de ne pas perturber entre les crochets et les accolades.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par Gruik Voir le message
    Oui c'est normal, la propriété 'papa_2' existe toujours en supprimant la propriété 'maman_1' de l'objet référencé par la propriété 'papa_2'.

    monTab['papa_2'] reference ensuite un objet vide (puisque la seule propriété qu'il y avait a été supprimée) mais monTab a toujours une propriété 'papa_2'

    Note : on peut utiliser la notation obj.propriete si le nom de propriété n'a pas besoin d'être dynamique
    Ok alors, y a t-il un moyen de supprimer par la meme occasion ce monTab['papa_2'] lorsqu'il fait reference à un objet vide?

  16. #16
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Non, faut le faire manuellement

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 422
    Points : 83
    Points
    83
    Par défaut
    Comment? Cette solution est correct? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    delete monTab["papa_2"]["maman_1"];
    var nb_prop = 0;
    for(var papa in monTab["papa_2"])
       nb_prop++;
     
    if(nb_prop == 0)
      delete monTab["papa_2"];
    Y a t il une meilleur solution que celle ci?

  18. #18
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Citation Envoyé par benthebest Voir le message
    Comment? Cette solution est correct?
    Oui

    Maintenant, peut etre que ya une meilleure façon de faire ce que tu veux faire au final avec des tableaux classiques, mais on sait pas ce que tu veux vraiment faire

Discussions similaires

  1. loop sur tableau associatif
    Par Plawi dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/02/2005, 11h29
  2. tableau associatif en asp ?
    Par bigsister dans le forum ASP
    Réponses: 5
    Dernier message: 26/01/2005, 16h47
  3. asp tableau associatif
    Par rfernandez dans le forum ASP
    Réponses: 6
    Dernier message: 19/12/2003, 18h58
  4. [langage] TRI TABLEAU ASSOCIATIF
    Par proner dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2003, 16h38
  5. [langage] Réinitialiser un tableau associatif.
    Par totox17 dans le forum Langage
    Réponses: 2
    Dernier message: 28/01/2003, 16h29

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