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

Contribuez Discussion :

Copie de tableau (Array) [FAQ]


Sujet :

Contribuez

  1. #1
    Invité
    Invité(e)
    Par défaut Copie de tableau (Array)
    Bonjour
    Dans la copie d'une variable tableau, il manque une solution simple:

    la méthode slice() d'un élément Array

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var monTableau = ["aaa", "bbb", "ccc", "ddd"];
    var maCopieDeMonTableau = monTableau.slice(0);
     
    monTableau[0] = "000";
    alert("monTableau = [" + monTableau.toString() + "] \n" +
            "maCopieDeMonTableau = [" + maCopieDeMonTableau.toString() + "]
    Affichera :
    monTableau = [000,bbb,ccc,ddd]
    maCopieDeMonTableau = [aaa,bbb,ccc,ddd]
    Voili, voilà

    jlmag

    PS: sans paramètre, la méthode slice() s'exécute sans erreur mais je n'ai pas trouvé de documentation fiable sans le premier paramètre, donc il est mis à 0 (valeur du début de la copie)

    rePS: page 638 "JavaScript la référence (5ème édition)"

    rerePS: pas testé pour tableau de tableau

    rererePS: est-il bon de modifier un type interne?

  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 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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 637
    Points : 66 658
    Points
    66 658
    Billets dans le blog
    1
    Par défaut
    Personnellement je passer par concat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var monTableau = ["aaa", "bbb", "ccc", "ddd"];
    var maCopieDeMonTableau = new Array().concat(monTableau)
    monTableau[0] = "000";
    alert("monTableau = [" + monTableau+" ]\n maCopieDeMonTableau = ["+maCopieDeMonTableau+"]" )
    ou avec toString():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var monTableau = ["aaa", "bbb", "ccc", "ddd"];
    var maCopieDeMonTableau = new Array(monTableau.toString())
    monTableau[0] = "000";
    alert("monTableau = [" + monTableau+" ]\n maCopieDeMonTableau = ["+maCopieDeMonTableau+"]" )
    le souci survient en effet pour les tableaux inclus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var monTableau = ["aaa", "bbb", ["ccc","eee"], "ddd"];
    var maCopieDeMonTableau = new Array().concat(monTableau)
    monTableau[0] = "000";
    alert("monTableau = [" + monTableau+" ]\n maCopieDeMonTableau = ["+maCopieDeMonTableau+"]" )
    monTableau[2][1]='coucou'
    alert(maCopieDeMonTableau[2][1])
    le sous tableau est passé en reference et non en valeur...
    Il faut donc une récurrence:
    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
    Array.prototype.clone = function() {
      var newArray = (this instanceof Array) ? [] : {};
      for (i in this) {
        if (i == 'clone') continue;
        if (this[i] && typeof this[i] == "object") {
          newArray[i] = this[i].clone();
        } else newArray[i] = this[i]
      } return newArray;
    }
     
    var monTableau = new Array("AAA",["aaa", "bbb", "ccc", "ddd"]);
    var maCopieDeMonTableau = new Array(monTableau.toString())
    var autreCopie=monTableau.clone()
    monTableau[1][0] = "000";
    alert("monTableau = [" + monTableau+" ]\n maCopieDeMonTableau = ["+maCopieDeMonTableau+"]" )
    // Le ligne suivante plante car le sous objet ou array n'est pas pris en compte avec toString... et avec un concat ou splice il est passé par reference
    //alert("monTableau[1][0]= "+ monTableau[1[0]+"\nmaCopieDeMonTableau[1][0]= "+ maCopieDeMonTableau[1][0])
    //par contre ici avec le clone pas de souci
    alert("monTableau[1][0]= "+ monTableau[1][0]+"\nautreCopie[1][0]= "+ autreCopie[1][0])
    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
    Invité
    Invité(e)
    Par défaut
    Bonjour SpaceFrog,

    pour toString(), c'est pas bon du tout!

    Sinon, au lieu d'étendre Array, mieux vaut-il étendre Object, non?

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    Object.prototype.clone = function()
    {
        var newChose = (this instanceof Array) ? [] : {};
        for (var i in this)
        {
            if (i == 'clone') continue;
            newChose[i] = (this[i] && typeof this[i] == "object") ? this[i].clone() : this[i];
        }
        return newChose;
    }
     
    var tableau = [
        "AAA",
        [
            "aaa",
            "bbb",
            "ccc",
            "ddd"
        ]
    ];
    var tableauAvecObjet = [
        "AAA",
        [
            "aaa",
            "bbb",
            "ccc",
            "ddd"
        ],
        {
            "un": 1,
            "deux": 2,
            "trois": 3
        }
    ];
    var objet = {
        "un": 1,
        "deux": {
            "hh": 7,
            "ii": 8
        },
        "trois": 3
    };
    var objetAvecTableau = {
        "un": 1,
        "deux": {
            "hh": 7,
            "ii": 8
        },
        "trois": 3,
        "quatre": [
            "AAA",
            [
                "aaa",
                "bbb",
                "ccc",
                "ddd"
            ]
        ]
    };
     
    // tableau
    var maCopieDeMonTableau = new Array(tableau.toString()); // pas bon !!!!
    var tableauCopie = tableau.clone();
    tableau[1][0] = "000";
     
    console.log("tableau");
    console.log(tableau);
    console.log(maCopieDeMonTableau);
    console.log("maCopieDeMonTableau.length : " + maCopieDeMonTableau.length);
    console.log(tableauCopie);
     
    // tableau avec objet
    var tableauAvecObjetCopie = tableauAvecObjet.clone();
    tableauAvecObjet[1][0] = "YYY";
    tableauAvecObjet[2].un = 9;
     
    console.log("tableau avec objet");
    console.log(tableauAvecObjet);
    console.log(tableauAvecObjetCopie);
     
    // objet
    var objetCopie = objet.clone();
    objet.un = 9;
     
    console.log("Objet");
    console.log(objet);
    console.log(objetCopie);
     
    // objet avec tableau
    var objetAvecTableauCopie = objetAvecTableau.clone();
    objetAvecTableau.un = 9;
    objetAvecTableau.quatre[1][0] = "YYY";
     
    console.log("objet avec tableau");
    console.log(objetAvecTableau);
    console.log(objetAvecTableauCopie);
    A+
    Dernière modification par Invité ; 05/04/2010 à 14h37.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 140
    Points : 623
    Points
    623
    Par défaut
    En tout cas, oui slice(0) ça marche bien pour dupliquer un tableau.

    Au fait, si on veut utiliser que le début d'un tableau dans une fonction, plutôt que d'appeler slice, mieux vaut passer le tableau et la longueur qu'on veut utiliser, c'est plus rapide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function somme(tab, len)
    {
      if (!len) len = tab.length;
      var result = 0;
      for (var i=0; i<len; i++)
        result += tab[i];
      return result;
    }
    Par-delà nos conceptions du bien et du mal se trouve une prairie. Je te rencontrerai là-bas.

  5. #5
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    et les sous tableau ?
    comme spaffy l'a indiqué il faut faire de la récursivité pour allez chercher tous les tableaux enfants et les cloner également
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  6. #6
    Invité
    Invité(e)
    Par défaut
    Comme le code que j'ai proposé à partir de celui de la Rainette.
    Les tableaux ou objets à plusieurs dimensions sont pris en compte.

    A quand dans la FAQ? hein!

    A+

Discussions similaires

  1. [FAQ] Javascript : Comment faire une copie d'un tableau ? (Array javascript)
    Par arnogues dans le forum Contributions JavaScript / AJAX
    Réponses: 16
    Dernier message: 15/11/2013, 19h19
  2. Copie de tableau dynamique Tridimensionel
    Par Zenol dans le forum C++
    Réponses: 23
    Dernier message: 19/12/2005, 16h00
  3. [Tableau]Problèmes avec copie de tableau
    Par Itachi-san dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 25/11/2005, 17h23
  4. Tableau(Array) sans taill
    Par krfa1 dans le forum ASP
    Réponses: 4
    Dernier message: 21/09/2005, 22h31
  5. tableau array
    Par laclac dans le forum Langage
    Réponses: 8
    Dernier message: 01/09/2005, 11h04

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