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 :

Copie de tableau indépendante


Sujet :

JavaScript

  1. #21
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    c'est du coupage de cheveux de toto en 4 ^^


    c'est très curieux parceque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var a = new String('toto')
    alert(a[0])
    renvoie undefined ?
    un alert du premier element renvoie Objet objet ... ???
    Sous FF, ça renvoie 't'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var s=new String('toto'); alert(s[0]); for(i in s) alert(i);
    La chaîne est découpée par caractère.

  2. #22
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    comme en php une chaine est considérée comme un array de caractères !
    mais pas sous IE
    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. #23
    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
    Attention également , un Objet , même s'il a une propriété length , n'est pas typé Array Spaffy ;-)
    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 )

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Comme dans beaucoup de langage en fait.

    Voici une fonction de clonage qui lève quelques lièvres. Inspirée d'une source d'un blog où il manquait la prise en compte de certains objets
    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
     
    if(!Object.clone)
    Object.prototype.clone = function clone (obj) {
    	if (obj === null) return null;
     
    	if (!obj) obj = this;
     
    	if (obj.cloneNode) return obj.cloneNode(true);
     
    	if (typeof(obj) != 'object') return obj;
     
    	var temp = (obj instanceof Array) ? new Array(obj.length) : new obj.constructor(obj);
     
    	for (var key in obj) {
    		if (!obj.hasOwnProperty(key)) continue;
    		temp[key] = (obj[key] === undefined)  ? undefined : clone(obj[key]);
    	}
     
    	return temp;
    };
    La méthode n'étant pas anonyme, on peut la soliciter par obj.clone() ou clone(obj).

    Fonctionne sous FF et Safari.

  5. #25
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par kernelfailure Voir le message
    Comme dans beaucoup de langage en fait.

    Voici une fonction de clonage qui lève quelques lièvres. Inspirée d'une source d'un blog où il manquait la prise en compte de certains objets
    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
     
    Object.prototype.clone = function clone (obj) {
        if(obj === null) return null;
     
        if(!obj) obj = this;
     
        if(typeof(obj) != 'object' && typeof(obj) != 'array') return obj;
     
        var temp = (typeof(obj) != 'array' && obj.constructor != Array) ? new obj.constructor(obj) : new obj.constructor(obj.length) ;
     
        for(var key in obj) {
            if (!obj.hasOwnProperty(key)) continue;
            temp[key] = (obj[key] === undefined)  ? undefined : clone(obj[key]);
        }
     
        return temp;
    }
    Il ne faut jamais modifier le prototype de Object, JAMAIS en JS, sinon tu vas pêter pas mal de code dans les site si ton truc mis dedans (notamment dans les "for in" ou on risque de ce récupérer cette methode "clone"

    Citation Envoyé par kernelfailure Voir le message
    La méthode n'étant pas anonyme, on peut la soliciter par obj.clone() ou clone(obj).

    Fonctionne sous FF et Safari.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par Gatsu35 Voir le message
    Il ne faut jamais modifier le prototype de Object, JAMAIS en JS, sinon tu vas pêter pas mal de code dans les site si ton truc mis dedans (notamment dans les "for in" ou on risque de ce récupérer cette methode "clone"
    En effet, c'est le but de prototype : Étendre toutes les instances et les objets qui en hérite.

    Quand à "péter du site" en enrichissant Object, tu devrais regarder certains frameworks javascript...
    C'est bien la première fois que je lis ça.

  7. #27
    Expert éminent sénior

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Points : 36 571
    Points
    36 571
    Par défaut
    Citation Envoyé par Gatsu35 Voir le message
    notamment dans les "for in" ou on risque de ce récupérer cette methode "clone"
    C'est peut être juste l'utilisation que tu fais de ce genre de boucle qui n'est pas des plus appropriée

    A+
    Pour tout savoir sur l'utilisation du forum

    En postant votre message, n'oubliez pas les Règles du Club.

  8. #28
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    suffit de tester ensuite dans les boucles for in si c'est un prototype ou pas avec hasOwnProperty non ?
    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 !

  9. #29
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par le_chomeur Voir le message
    Attention également , un Objet , même s'il a une propriété length , n'est pas typé Array Spaffy ;-)
    Heu... non justement, c'est d'ailleurs bien une raison importante pour répéter que les tableaux associatifs n'existent pas en JavaScript : le type Object ne possède pas de propriété length :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var test={
        'toto': 'tata',
        'valeur': 1,
        3: 'autrechose'
    }
    alert(test.length)
    Citation Envoyé par kernelfailure Voir le message
    Voici une fonction de clonage qui lève quelques lièvres. Inspirée d'une source d'un blog où il manquait la prise en compte de certains objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
        if(typeof(obj) != 'object' && typeof(obj) != 'array') return obj;
    Amusant ça... j'aimerais bien voir un Array avoir pour typeof 'array'
    Là encore, c'est une source de confusion courante, le typeof d'un objet Array est object !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var tab = [1,2,3];
    alert(typeof tab)
    Citation Envoyé par Gatsu35 Voir le message
    Il ne faut jamais modifier le prototype de Object, JAMAIS en JS, sinon tu vas pêter pas mal de code dans les site si ton truc mis dedans (notamment dans les "for in" ou on risque de ce récupérer cette methode "clone"
    Là dessus, je rejoins allègrement kernelfailure et E.Bzz.
    Ensuite, c'est comme pour tout, utiliser prototype implique de savoir assez précisément ce que l'on fait, ce qui n'est malheureusement pas souvent le cas avec JavaScript...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Amusant ça... j'aimerais bien voir un Array avoir pour typeof 'array'
    En effet. Je ne sais pas ce qu'il m'a pris... Bien vu

    Correction(s) apportée(s)

    EDIT:
    La version 'finale'(?) de toSource() puisque j'avais commencé par là pour lequel un clonage = eval( original.toSource() ) fonctionne aussi :
    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
     
    if(!Object.toSource)
    Object.prototype.toSource = function toSource (obj) {
    	if (obj === null) return 'null';
     
    	if (!obj) obj = this;
     
    	switch (obj.constructor) {
    		case Boolean:
    			return (typeof(obj) != 'object') ? obj : "(new Boolean(" + obj + "))";
    		case Number:
    			return (typeof(obj) != 'object') ? obj : "(new Number(" + obj + "))";
    		case String:
    			var s = '\"' + obj.replace(/[\\\"\']/g,"\\$&") + '\"';
    			return (typeof(obj) != 'object') ? s : "(new String(" + s + "))";
    		case Date:
    			return "(new Date(" + obj.valueOf() + "))";
    		case RegExp:
    			return obj;
    		case Function:
    			return '(' + obj.toString().replace(/[\s]+/g,' ').replace(/{ /g,'{').replace(/ }/g,'}') + ')';
    		case Array:
    			var a = new Array(obj.length);
     
    			if (!new RegExp(/^[,]+$/).test(obj.toString())) {
    				for (var i=0, n=obj.length; i<n; i++) {
    					a[i] = (obj[i] === undefined) ? '(void 0)' : toSource(obj[i]);
    				}
    			}
    			return '[' + a.toString() + ']';
    		default:
    			var o = [];
    			for (var p in obj) {
                			if (!obj.hasOwnProperty(p)) continue;
    				o.push(p.valueOf() + ':' + (obj[p] === undefined ? '(void 0)' : toSource(obj[p])));
    			}
    			return "({" + o.join(", ") + "})";
    	}
    };

  11. #31
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    pour lequel un clonage = eval( original.toSource() ) fonctionne aussi :
    malheureusement pas de façon crossbrowser
    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 !

  12. #32
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par kernelfailure Voir le message
    En effet, c'est le but de prototype : Étendre toutes les instances et les objets qui en hérite.

    Quand à "péter du site" en enrichissant Object, tu devrais regarder certains frameworks javascript...
    C'est bien la première fois que je lis ça.
    Citation Envoyé par E.Bzz Voir le message
    C'est peut être juste l'utilisation que tu fais de ce genre de boucle qui n'est pas des plus appropriée

    A+
    Citation Envoyé par SpaceFrog Voir le message
    suffit de tester ensuite dans les boucles for in si c'est un prototype ou pas avec hasOwnProperty non ?
    Citation Envoyé par Bovino Voir le message

    Là dessus, je rejoins allègrement kernelfailure et E.Bzz.
    Ensuite, c'est comme pour tout, utiliser prototype implique de savoir assez précisément ce que l'on fait, ce qui n'est malheureusement pas souvent le cas avec JavaScript...
    Les prototypes de Array, Number, Date si vous voulez, mais certainement pas Object.

    le simple fait de créer un objet basique du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var o = {y:12, x:14}
    quand tu vas itérer dessus pour récupérer ses propriétés et dans un cas par exemple le sérialiser et que tu ne fais pas de test sur les attributs (car tu sais que ton objet est simple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (var i in o) {
      console.log(o[i],':',typeof o[i]);
    }
    y : 12 => number
    x : 14 => number
    clone : function() => function
    Donc comme tu peux le voir nous avons un magnifique résidu moisi qui n'a rien à faire ICI. C'est pour cela qu'il ne faut jamais modifier le prototype de Object en JS, tu peux modifier le prototype de Array, Number ou Date ou n'importe quel autre Classe si tu veux, mais pas Object

    exemple encore plus flagrant quand tu as une map de fonctions :
    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
     
    var tablesTypeMap = {
    	tableData1 : {
    	   //pleins de trucs dedans
    	},
     
    	tableData2 : {
     
    	},
     
    	EnergyValues : {
     
    	}
     
    }
    Et la je voudrais par exemple lister tous les éléments de cette map pour une raison ou une autre dans un array :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var mapItemsList = [];
    for (var i in tablesTypeMap) {
    	mapItemsList.push(i);
    }
     
    alert(mapItemsList.join(';')) --> tableData1;tableData2;EnergyValues;toSource() // ya un intrus ici
    C'est là ou je veux en venir, en général en JS, un objet est vide, ne contient aucune méthode, et on a souvent l'habitude de s'en servir comme hashmap par exemple, donc si on se retrouve avec des methodes sur nos object on peut foirer un application.

    Il m'arrive parfois d'avoir des hashmap de fonctions, et j'aime pas avoir un intrus en plus


    Aucune des librairies tels que Mootools ou Jquery ne tapent sur Object.prototype, pour PrototypeJS je ne sais pas

  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    malheureusement pas de façon crossbrowser
    Exact. Tu as raison de le préciser.
    IE7 ne le digère pas, à cause de Element, qu'il n'implémente pas.

    Il existe quelques solutions qui passent par des wrappers, mettant en oeuvre ou pas HTC. On sombre dans l'exotisme, comme toujours.

    IE6, j'imagine que non et je ne m'en soucis pas, pas plus que de communicator.
    Logiquement, ça devrait passer IE8 puisqu'il est prétendument "respectueux DOM W3C".

    Pour ma part, ça fonctionne sous FF, Opera et Safari.
    Ca ne fonctionnera pas sous Lynx, et donc peut-être pas sous IE.

    (confusion avec une autre source : Pas d'utilisation de Element ici)

    Sous quel autre nav as-tu testé ?

  14. #34
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    je teste principalement sous FFX Opera IE et google chrome parfois lunascape
    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 !

  15. #35
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    je trouve que vos propositions sont lourdes et compliqué, si il s'agit juste de copié un tableau en profondeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Array.prototype.deepClone = function(){
             var obj = this.slice();
             for(var i = 0, l = obj.length; i < l; i++)
                  if(obj[i].constructor == Array)
                      obj[i] = obj[i].deepClone();
             return obj;
        };
     
        var ar = new Array(1,['oui',['no','niet']],3,{hello:"bonjour",goodbye:"aurevoir"}),
        ar2 =  ar.deepClone();
     
        alert(ar2[1] == ar[1])
    on peux pas faire plus simple

  16. #36
    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 640
    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 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    sauf que ta copie en profondeur ne s'applique pas dasn ce cas au dernier element de l'array il copie par reference :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       Array.prototype.deepClone = function(){
             var obj = this.slice();
             for(var i = 0, l = obj.length; i < l; i++)
                  if(obj[i].constructor == Array)
                      obj[i] = obj[i].deepClone();
             return obj;
        };
     
        var ar = new Array(1,['oui',['no','niet']],3,{hello:"bonjour",goodbye:"aurevoir"}),
        ar2 =  ar.deepClone();
        ar[3]['hello']='bingo'
        alert(ar2[3]['hello'])
    retourne bingo au lieu de bonjour
    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 !

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    ba c'est normale en faite

    La question était

    Je souhaite faire une deep copy, c'est à dire que je souhaite que les deux tableaux soient indépendants, l'un devant être une "sauvegarde" de l'autre.
    il s'agit donc juste de copié en profondeur un tableau de tableau, et non pas de copié tout les membres descendant.

  18. #38
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par Gatsu35 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for (var i in o) {
      console.log(o[i],':',typeof o[i]);
    }
    y : 12 => number
    x : 14 => number
    clone : function() => function
    De la même manière qu'on ne liste pas un répertoire courant en incluant sa racine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (var i in o) {
      if(!o.hasOwnProperty()) continue;
      console.log(o[i],':',typeof o[i]);
    }
    y : 12 => number
    x : 14 => number
    C'est l'intérêt de prototype. avec hasOwnProperty, on sait s'il s'agit d'une propriété hérité ou pas.

  19. #39
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    je teste principalement sous FFX Opera IE et google chrome parfois lunascape
    Peux tu être plus précis STP ?

    J'ai testé sous FF, Opera, IE7 et Chrome (Que je viens d'installer) et ça fonctionne.

  20. #40
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Points : 491
    Points
    491
    Par défaut
    une fonction pour tout cloner ....

    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
    Object.isCollection = function(obj){
             return obj && typeof obj.item == 'function' && obj.namedItem == 'function';
        };
     
        Object.isArrayLike = function(obj){
             return obj && (obj.constructor == Array || obj.callee || Object.isCollection(obj));
        };
     
        Object.isObjectLike = function(obj){
             return typeof obj == 'object' && obj.constructor != Array && obj.constructor != Date && obj.constructor != RegExp && !Object.isCollection(obj);
        };
     
        Object.isFunction = function(obj){
             return typeof obj == "function";
        };
     
        var deepClone = function(obj){
            var isArrayLike =  Object.isArrayLike(obj), 
            isObjectLike = Object.isObjectLike(obj),
            isFunction = Object.isFunction(obj),
            res;
     
            if(isArrayLike){
                res = [];//on peux pas appélle le constructeur de argument et d'une colection donc on renvoie tjrs un tableau
                for(var i = 0, l = obj.length; i < l; i++)
                    res[i] = deepClone(obj[i]);
            }else if(isObjectLike){
                res = {};
                for(var i in obj)
                    res[i] = deepClone(obj[i]);
            }else if(isFunction){
                var res = eval('[' + obj.toString() + ']')[0];
                for(var i in obj)
                     if(this.hasOwnProperty(i)) 
                         res[i] = deepClone(obj[i]);
                for(var i in obj.prototype)
                    res.prototype[i] = deepClone(obj.prototype[i]);
            }else res = obj;
     
            return res;
        }
     
     
        var ar = new Array(1,['oui',['no','niet']],3,{hello:"bonjour",goodbye:"aurevoir"}),
        ar2 =  deepClone(ar);
     
        ar[3]['hello']='bingo'
        alert(ar2[3]['hello']);

Discussions similaires

  1. Copie un tableau dans un autre
    Par Montor dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/05/2008, 21h29
  2. redimenssionnement & copie de tableau
    Par TOPGUN89 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/09/2007, 14h45
  3. Format des surfaces et copies vers tableau
    Par ultimanu dans le forum DirectX
    Réponses: 7
    Dernier message: 12/04/2007, 16h33
  4. Copie de tableau dynamique Tridimensionel
    Par Zenol dans le forum C++
    Réponses: 23
    Dernier message: 19/12/2005, 16h00
  5. [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

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