Cloner / copier une variable de carte Javascript

Comment cloner / copier une carte en Javascript?

Je sais comment cloner un tableau, mais comment puis-je cloner / copier une carte?

var myArray = new Array(1, 2, 3); var copy = myArray.slice(); // now I can change myArray[0] = 5; & it wont affect copy array // Can I just do the same for map? var myMap = new ?? // in javascript is it called a map? var myMap = {"1": 1, "2", 2}; var copy = myMap.slice(); 

Une méthode simple consiste à copier chaque propriété de la carte source sur la carte cible:

 var newMap = {}; for (var i in myMap) newMap[i] = myMap[i]; 

Avec l’introduction de Maps en JavaScript, c’est assez simple si l’on considère que le constructeur accepte une itération:

 var newMap = new Map(existingMap) 

Documentation ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

JQuery a une méthode pour étendre un object (fusionner deux objects), mais cette méthode peut également être utilisée pour cloner un object en fournissant un object vide.

 // Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject); 

Plus d’informations peuvent être trouvées dans la documentation de jQuery .

Il n’y a rien de construit

Utilisez un copieur de propriétés récursif bien testé ou, si les performances ne sont pas un problème, effectuez une sérialisation sur JSON et parsingz à nouveau un nouvel object.

Il n’y a pas de clone / copie intégré. Vous pouvez écrire votre propre méthode en copie superficielle ou profonde:

 function shallowCopy(obj) { var result = {}; for (var i in obj) { result[i] = obj[i]; } return result; } function deepCopy(obj) { var result = {}; for (var i in obj) { // recursion here, though you'll need some non-sortingvial logic // to avoid getting into an endless loop. } return result; } 

Tous les objects en Javascript sont dynamics et peuvent recevoir de nouvelles propriétés. Une “carte” comme vous vous en référez est en fait un object vide. Un tableau est aussi un object, avec des méthodes telles que les slice et les propriétés comme la length .

J’ai remarqué que Map nécessitait un traitement spécial, donc avec toutes les suggestions de ce sujet, le code sera:

 function deepClone( obj ) { if( !obj || true == obj ) //this also handles boolean as true and false return obj; var objType = typeof( obj ); if( "number" == objType || "ssortingng" == objType ) // add your immutables here return obj; var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor(); if( obj instanceof Map ) for( var key of obj.keys() ) result.set( key, deepClone( obj.get( key ) ) ); for( var key in obj ) if( obj.hasOwnProperty( key ) ) result[key] = deepClone( obj[ key ] ); return result; } 

Très simple de cloner une carte car ce dont vous parlez n’est qu’un object. Il y a une Map dans ES6 que vous devriez rechercher, mais pour copier un object, utilisez simplement Object.assign()

 let map = {"a": 1, "b": 2} let copy = Object.assign({}, map); 

Vous pouvez également utiliser cloneDeep() depuis Lodash

 let copy = cloneDeep(map);