Partage
  • Partager sur Facebook
  • Partager sur Twitter

objet POO affecte en traitant array recuperer

2 tableaux traites comme 1 variable non distincte

Anonyme
    30 septembre 2016 à 16:18:38

    Bonjour,

    Je récupère un array d'un objet :

    var casesOQP = this.casesGrisees;

    this.casesGrisees est un tableau contenant une liste de coordonnees (ex this.casesGrisees[0] = [3, 7])

    Ensuite je touche à casesOQP :

    casesOQP[casesOQP.length] = new Array(j1.position[0], j1.position[1]);

    Pour rentrer une coordonnee.

    MAis this.casesGrisees s'en retrouve affecté aussi !

    POurtant dans ce cas les deux sont et devraient être traitées en var distinctes ??

    Je ne comprends pas.

    Merci.

     [edit] : re tester :

    var duplic = nouveauPlateau.casesGrisees;
    console.log("test : " + nouveauPlateau.casesGrisees.length);
    duplic[duplic.length] = new Array(3, 990);
    console.log("test : " + nouveauPlateau.casesGrisees.length);

    Nouveauplateau grandit bien ... Pourquoi ? et comment l'éviter ?

    -
    Edité par Anonyme 30 septembre 2016 à 16:22:22

    • Partager sur Facebook
    • Partager sur Twitter
      30 septembre 2016 à 16:29:23

      Bonjour,

      Si je ne dit pas de betises un objet est passé par référence donc duplic et nouveauPlateau.casesGrisees pointe vers le même objet.

      https://snook.ca/archives/javascript/javascript_pass

      Pour éviter ca il faut cloner tes objets:

      http://heyjavascript.com/4-creative-ways-to-clone-objects/

      • Partager sur Facebook
      • Partager sur Twitter
      Un petit +1 si je vous ai aidé est toujours appréciable :).
      Anonyme
        30 septembre 2016 à 16:38:19

        OK, je croyais que ça pointait vers la même chose que pour les éléments DOM. Et que les var elles étaient traitées distinctement.

        Après test en effet :

        var duplic = Object.create(nouveauPlateau.casesGrisees);
        console.log("test : " + nouveauPlateau.casesGrisees.length);
        duplic[duplic.length] = new Array(3, 990);
        console.log("test : " + nouveauPlateau.casesGrisees.length);

        Duplic n'est plus affecté.

        [edit] : plus affecté du tout en fait !! Mon clone est protégé en écriture :(((( 

        Ainsi, je ne peux plus lui ajouter de coordonnées pour mes vérifications : 

        var duplic = Object.create(nouveauPlateau.casesGrisees); // on mettra J1 dedans pour pas faire doublon des deux J au mm endroit
        console.log('long clone : ' + duplic.length); // marque 2
        duplic[duplic.length] = new Array('test', 'test');
        console.log('long clone modifié: ' + duplic.length);// marque 2
        
        
        console.log('long CG : ' + nouveauPlateau.casesGrisees.length); // marque 2
        nouveauPlateau.casesGrisees[nouveauPlateau.casesGrisees.length] = new Array('test', 'test');
        console.log('long CG modifié : ' + nouveauPlateau.casesGrisees.length); // marque 3 !!


        Par contre aucun souci pour modifier une variable existante.

        [edit2] : j'ai trouvé une astuce très bidouille :

        dduplic.length = duplic.length + 1;
        duplic[duplic.length - 1] =  ["test","testB"];
        console.log('long clone modifié: ' + duplic.length);

        Mais ça me plaît très moyennement.

        SI qqun à le comment du pourquoi et comment faire pour rester dans de bonnes pratiques.

        Merci



        -
        Edité par Anonyme 30 septembre 2016 à 17:43:56

        • Partager sur Facebook
        • Partager sur Twitter
          1 octobre 2016 à 17:19:12

          La méthode slice() permet de dupliquer un tableau. elle devrait résoudre votre problème...

          var duplic = monTableau.slice();



          • Partager sur Facebook
          • Partager sur Twitter

          objet POO affecte en traitant array recuperer

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown