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 :

Double array d'objets


Sujet :

JavaScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    IRIS, ATS, 3IL Rodez
    Inscrit en
    Juin 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : IRIS, ATS, 3IL Rodez

    Informations forums :
    Inscription : Juin 2014
    Messages : 27
    Points : 26
    Points
    26
    Par défaut Double array d'objets
    Bonjour,


    Je découvre le Js depuis quelque jours, et étant familier du c/c++ j'avoue être très surpris de l'approche de ce langage ! ()


    J'aimerais créer un bête tableau à deux dimensions d'objets prédéfinis, mais je m'embrouille avec ces histoires d'objets proto-typés et tout la logique qui va avec...

    En gros j'ai l'impression qu'il me faudrait créer un array, puis le remplir d'array, puis dans chaque array initialiser avec new mon objet prédéfinis, quelle lourdeur !

    Mon constructeur ressemble à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function Tile(P_position_x, P_position_y){
     
       this.D_position_x = P_position_x;
       this.D_position_y = P_position_y;
     
       }
    S'il s'agissait d'une "classe", en C il "me suffirait" d'un simple Tile Grille[largeur][longueur];

    En Js, je n'arrive pas à écrire mieux que ç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
    var tableau = new Array(5);
     
    function Tile(P_position_x, P_position_y){
     
      this.D_position_x = P_position_x;
      this.D_position_y = P_position_y;
     
    }
     
    for (var i = 0; i < 5; i++) {
      tableau[i] = new Array(5);
      for (var u = 0; u < 5; u++) {
        tableau[i][u] = new Tile(4,2) ;
      }
    }
    alert(tableau[0][3].D_position_x+""+tableau[2][4].D_position_y); // affiche 42
    alert(tableau[4][2].D_position_x+""+tableau[4][2].D_position_y); // affiche 42
    Bref, autant dire que j'aimerais savoir s'il n'y a pas plus simple (et juste...) pour répondre à un besoin aussi primaire !

    Si vous aviez une piste, je vous en remercierais grandement ! Tous les tutos fréquentés (sdz, mozilla, devellopez...) n'ont réussi qu'à m'embrouiller

    Bonne journée à vous !

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    C'est un autre langage, donc des moyens différents et des possibilités différentes.

    En utilisant ES2015, le JS d'aujourd'hui :

    Code JavaScript : 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
    function Tile( P_position_x, P_position_y ){
      this.D_position_x = P_position_x;
      this.D_position_y = P_position_y;
    }
     
    const
      longueur = 5,
      tableau = new Array( longueur );
     
    // initialisation du tableau
    tableau.fill( new Array( longueur ) );
     
    for ( let item of tableau ){
      item.fill( new Tile( 4, 2 ) );
    }
     
    // debug, console, touche F12
    for ( let item of tableau ){
      for ( let jtem of item ){
        console.log( jtem );
      }
    }
     
    // votre test
    console.log( tableau[0][3].D_position_x + "" + tableau[2][4].D_position_y ); // affiche 42
    console.log( tableau[4][2].D_position_x + "" + tableau[4][2].D_position_y ); // affiche 42

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    IRIS, ATS, 3IL Rodez
    Inscrit en
    Juin 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : IRIS, ATS, 3IL Rodez

    Informations forums :
    Inscription : Juin 2014
    Messages : 27
    Points : 26
    Points
    26
    Par défaut
    Salut !

    Merci ! Une réponse au top ! Je vais regarder tout ça de plus près...

    Bonne journée à toi, et merci encore !

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je précise, puisque vous débutez en JS, que la norme ES2015 utilisée dans le code de Daniel n'est pas bien supportée par les navigateurs anciens comme IE. Attention si vous avez des contraintes de support
    One Web to rule them all

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    IRIS, ATS, 3IL Rodez
    Inscrit en
    Juin 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : IRIS, ATS, 3IL Rodez

    Informations forums :
    Inscription : Juin 2014
    Messages : 27
    Points : 26
    Points
    26
    Par défaut
    Merci bien

    C'est noté ! De toute façon depuis que j'ai commencé... c'est toujours IE qui finit en par être pointé du doigt dans les tutos... Je commence a anticiper le truc !

    En tout cas le coup des let/const à l'air d'être assez majeur comme évolution, merci pour l'info !

    Bonne soirée !

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    EDIT :
    Citation Envoyé par https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/fill
    La méthode fill() remplit tout les éléments d'un tableau entre deux index avec une valeur statique.
    Il est normal que cela ne fonctionne pas pour un objet, car il affecte le même objet à chaque cellule du tableau. Il est impossible de faire tableau.fill( new Array( longueur ) );.

    Voir : http://www.developpez.net/forums/d16...s/#post8750629

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    La méthode fill ne peut prendre qu'une valeur statique, mais on peut construire et initialiser un tableau simple ou un tableau à deux dimensions avec Array.from(arrayLike[, fonctionMap[, thisArg]]).

    Voir : https://developer.mozilla.org/fr/doc...aux/Array/from
    Et : http://exploringjs.com/es6/ch_arrays.html#Array_from

    Exemple :

    Code JavaScript : 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
    function Cellule( actif, age, abouge ){
      this.actif = actif;
      this.age = age;
      this.abouge = abouge;
    }
     
    const
      longueur = 20,
      tableau = Array.from( new Array( longueur ), () => Array.from( new Array( longueur ), () => new Cellule( false, 0, false ) ) );
     
    // test
    tableau[1][1].age = 66;
    tableau[5][5].actif = true;
    tableau[15][3].abouge = true;
     
    // debug, console, touche F12
    for ( let [ i, item ] of tableau.entries() ){
      for ( let [ j, jtem ] of item.entries() ){
        console.log( `[ ${i}, ${j} ] : actif = ${ jtem.actif }, age = ${ jtem.age }, abouge = ${ jtem.abouge }` );
      }
    }

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    IRIS, ATS, 3IL Rodez
    Inscrit en
    Juin 2014
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : IRIS, ATS, 3IL Rodez

    Informations forums :
    Inscription : Juin 2014
    Messages : 27
    Points : 26
    Points
    26
    Par défaut merci
    Merci encore Daniel ! Heuresement que tu es là !

    Je suis tombé exactement sur le même problème peu après avoir lu ta réponse sur mon sujet précédent !

    Je modifiais mon tableau d'objet(S?!) en utilisant "tableau[x][y].blablabla]" sans me rendre compte qu'il s'agissait du même objet...

    Je commence à trouver ça un peu tiré par les cheveux de devoir écrire pour un tableau a 2D d'objets :
    const
    longueur = 5,
    tableau = Array.from( new Array( longueur ), () => Array.from( new Array( longueur ), () => new Cellule( false, 0, false ) ) );



    On est loin de ce qu'on pourrait imaginer innocemment en attaquant le Js... Je m'attendais un langage beaucoup plus "friendly".
    Comment ce fait-il que se soit aussi contre intuitif ?! Mystère !

    Bon code à vous !

  9. #9
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Intéressant le coup du Array.from, perso j'ai l'habitude de passer par un fill().map():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const tableau = Array(longueur).fill().map(() => Array(longueur).fill().map(() => new Cellule( false, 0, false ) ))
    Ce n'est pas le plus intuitif parce qu'on cherche une solution en une seule ligne avec un style fonctionnel. Une approche plus "user-friendly/débutant" serait d'utiliser deux boucles for comme tu l'as fait au départ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var tableau = [];
    for(var i=0; i<longueur; i++){
       tableau[i] = [];
       for(var j=0; j<longueur; j++){
         tableau[i][j] = new Cellule(false, 0, false);
      }
    }
    C'est encore ce qu'il y a de plus clair
    One Web to rule them all

  10. #10
    Membre expérimenté
    Homme Profil pro
    bricoleur par les mots
    Inscrit en
    Avril 2015
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : bricoleur par les mots
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2015
    Messages : 713
    Points : 1 597
    Points
    1 597
    Par défaut
    Une approche plus "user-friendly/débutant"
    le mot débutant est un peut fort.

    Dans plus ou moins le même sens au lieux de dire abeille on devrait dire Anthophila

    quand j'ai commencé a apprendre javascript en voyant ce genre de syntaxe j'aurais fuis a toutes jambes
    Plus vite encore plus vite toujours plus vite.

  11. #11
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Citation Envoyé par Ragoudcep Voir le message
    Je commence à trouver ça un peu tiré par les cheveux de devoir écrire pour un tableau a 2D d'objets :
    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const
          longueur = 5,
          tableau = Array.from( new Array( longueur ), () => Array.from( new Array( longueur ), () => new Cellule( false, 0, false ) ) );
    C'est peut-être la notation arrow qui vous fait paraître la chose complexe. Lorsqu'on l'utilise tous les jours, on trouve au contraire qu'elle simplifie les codes.

    Version avec () => :

    let tableau = Array.from( new Array( longueur ), () => Array.from( new Array( longueur ), () => new Cellule( false, 0, false ) ) );.

    Version avec function :

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    let tableau = Array.from( new Array( longueur ), 
      function(){
        return Array.from( new Array( longueur ), 
          function(){
            return new Cellule( false, 0, false )
          }
        )
      }
    );

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

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

Discussions similaires

  1. cell array --> double array ?
    Par Truth dans le forum MATLAB
    Réponses: 2
    Dernier message: 06/04/2008, 14h24
  2. [Tableaux] Classer un array d'objets
    Par Linio dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2007, 17h24
  3. Déclarer un Array d'Objet?
    Par lekunfry dans le forum Flex
    Réponses: 1
    Dernier message: 26/11/2007, 01h59
  4. wxWidgets définir un array d'objets
    Par reptils dans le forum wxWidgets
    Réponses: 1
    Dernier message: 26/07/2006, 16h00
  5. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24

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