Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 09h38   #1
Membre du Club
 
Étudiant
Inscription : juillet 2005
Messages : 267
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2005
Messages : 267
Points : 58
Points : 58
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 :
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 !
__________________
Blog : http://alacoche.geekos.fr/

Donnez votre voix pour 2012 : http://www.votelibre.fr/
nims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 09h41   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 047
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

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

Informations forums :
Inscription : mars 2002
Messages : 30 047
Points : 45 152
Points : 45 152
push est supposé ajouter un element dans le tableau ... pas retourner sa taille
__________________
Ma page 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


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 09h45   #3
Membre du Club
 
Étudiant
Inscription : juillet 2005
Messages : 267
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2005
Messages : 267
Points : 58
Points : 58
Il ajoute un élément, modifie la taille du tableau et retourne la nouvelle taille (je viens de retester) :

Code :
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
__________________
Blog : http://alacoche.geekos.fr/

Donnez votre voix pour 2012 : http://www.votelibre.fr/
nims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 09h54   #4
Membre du Club
 
Étudiant
Inscription : juillet 2005
Messages : 267
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2005
Messages : 267
Points : 58
Points : 58
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
__________________
Blog : http://alacoche.geekos.fr/

Donnez votre voix pour 2012 : http://www.votelibre.fr/
nims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h39   #5
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 871
Points : 1 380
Points : 1 380
Code :
result.data.push({x:obj.data[i].x});

ou plus globalement :

Code :
1
2
3
4
var newObj = {};
for(var k in (obj.data[i])
	newObj[k] = obj.data[i][k];
result.data.push(newObj);
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h41   #6
Membre du Club
 
Étudiant
Inscription : juillet 2005
Messages : 267
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2005
Messages : 267
Points : 58
Points : 58
Merci pour ta réponse.

Sauf que
Code :
  result.data.push({x:obj.data[i].x});
m'oblige à connaitre la structure de data[i]...

Voici ma proposition:

Code :
result.data.push(JSON.parse(JSON.stringify(obj.data[i])));
__________________
Blog : http://alacoche.geekos.fr/

Donnez votre voix pour 2012 : http://www.votelibre.fr/
nims est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h48   #7
Membre Expert
 
Avatar de Willpower
 
Homme Boris Dessy
sans emploi
Inscription : décembre 2010
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Boris Dessy
Localisation : Belgique

Informations professionnelles :
Activité : sans emploi

Informations forums :
Inscription : décembre 2010
Messages : 871
Points : 1 380
Points : 1 380
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.
Willpower est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 11h49   #8
Membre du Club
 
Étudiant
Inscription : juillet 2005
Messages : 267
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2005
Messages : 267
Points : 58
Points : 58
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
__________________
Blog : http://alacoche.geekos.fr/

Donnez votre voix pour 2012 : http://www.votelibre.fr/
nims est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h05.


 
 
 
 
Partenaires

Hébergement Web