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 :

push() : modifie le tableau d'origine ?!


Sujet :

JavaScript

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut push() : modifie le tableau d'origine ?!
    Bonjour,

    Dans la doc, push() retourne la taille du tableau et n'est pas censé modifier le tableau "parent".

    Voici le code :
    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
     
    var obj = {                 
        data : [{x : 100}]
    };
     
    var result = {                   
        data : []
    }; 
     
     
    for(var i = 0;i < obj.data.length;i++){ 
     
        result.data.push(obj.data[i]);
     
        console.log(obj.data[i].x+' '+result.data[i].x);
     
     
        result.data[i].x = 200;
     
        console.log(obj.data[i].x+' '+result.data[i].x);
     
    }
    Mon premier console.log() affiche : 100 100
    Le second console.log() affiche : 200 200

    Pourquoi le tableau obj.data est modifié ?

    Merci d'avance pour votre aide !

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Par défaut
    push est supposé ajouter un element dans le tableau ... pas retourner sa taille
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut
    Il ajoute un élément, modifie la taille du tableau et retourne la nouvelle taille (je viens de retester) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    console.log(obj.data.push('test'));
    ==> Retourne 2...

    Mais c'est pas le problème

    Mon code est inutile mais c'est pour l'exemple!

    Je copie obj.data dans result.data.
    Je modifie la valeur de result.data[i].
    Ce qui entraine une modification sur obj.data[i] ..

    :s

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut
    Le problème vient de la structure de mes objets !

    Le push() doit copier l'adresse de data[i] et non le contenu...

    Si je passe tout en tableau, ca se comporte normalement...

    Comment faire ca du coup :s
    Et ne proposez pas de tout passer en tableau mdr

  5. #5
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result.data.push({x:obj.data[i].x});

    ou plus globalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var newObj = {};
    for(var k in (obj.data[i])
    	newObj[k] = obj.data[i][k];
    result.data.push(newObj);

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut
    Merci pour ta réponse.

    Sauf que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      result.data.push({x:obj.data[i].x});
    m'oblige à connaitre la structure de data[i]...

    Voici ma proposition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result.data.push(JSON.parse(JSON.stringify(obj.data[i])));

  7. #7
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Je pense que ma seconde solution est meilleure alors, bien que je ne connaisse pas le code natif de JSON.stringify, je suposse qu'il fait une boucle et que pour chaque élément il l'ajoute à un string.

    Ensuite JSON.parse fait probablement l'inverse, tu as donc 2 boucle plus des convertion en string, alors que ma solution effectue une simple boucle.

    Après évidement si tu as une structure encore plus complexe avec des objets contenus dans des objets, tu peux faire une fonction de parcours/copie qui vérifiera pour chaque élément s'il s'agit d'un objet et dans ce cas faire un appel récursif.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2005
    Messages : 277
    Par défaut
    Oui, tu a raison.

    J'utilise ceci pour un plugin jQuery.
    Du coup c'est pas l'aspect principale de la chose mais ça pourra faire l'objet d'une amélioration...

    Merci pour ton aide

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

Discussions similaires

  1. [Tableaux] Modifier un tableau sur une page en PHP
    Par leclone dans le forum Langage
    Réponses: 12
    Dernier message: 02/01/2007, 14h06
  2. Modifier un tableau avec innerHTML sous IE
    Par Gédéon dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/12/2006, 12h32
  3. Réponses: 11
    Dernier message: 14/10/2006, 21h26
  4. [Debutant] Besoin d'aide pour modifier un tableau...
    Par CyberTwister dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/03/2006, 14h14
  5. modifier un tableau avec javascript
    Par lemmings dans le forum Général JavaScript
    Réponses: 27
    Dernier message: 15/11/2005, 10h10

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