Comment cloner / copier une carte en JavaScript?
Je sais comment cloner un tableau mais comment 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();
javascript
sazr
la source
la source
let copy = {...myMap};
Réponses:
Un moyen simple (pour faire une copie superficielle) est de copier chaque propriété de la carte source sur la carte cible:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
la source
Avec l'introduction de Maps en JavaScript, c'est assez simple étant donné que le constructeur accepte un itérable:
var newMap = new Map(existingMap)
Documentation ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
la source
Map.prototype.entries
etMap.prototype.set
. Cela signifie: si vous écrivez une classe qui étend Map et écrase l'une ou l'autre de ces deux méthodes, la simple écriturenew ExtendedMap( extendedMapObj )
ne fonctionnera pas si les méthodes étendues reposent sur des propriétés qui ne sont pas disponibles pour le super.var newMap = new Map(existingMap)
estO(n)
oùn
est le nombre de paires clé / valeur de la carte? Je suppose que l'opération de clonage n'est pas constanteO(1)
si, comme vous le dites,Map.prototype.entries
est appelé sous le capot ...Très simple pour cloner une carte puisque ce dont vous parlez n'est qu'un objet. Il y a un
Map
dans ES6 que vous devriez rechercher, mais pour copier un objet, utilisez simplementObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Vous pouvez également utiliser
cloneDeep()
depuis Lodashlet copy = cloneDeep(map);
la source
JQuery a une méthode pour étendre un objet (fusion de deux objets), mais cette méthode peut également être utilisée pour cloner un objet en fournissant un objet 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 jQuery .
la source
Il n'y a rien de intégré.
Utilisez un copieur de propriétés récursives bien testé ou, si les performances ne sont pas un problème, sérialisez vers JSON et analysez à nouveau vers un nouvel objet.
la source
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-trivial logic // to avoid getting into an endless loop. } return result; }
Tous les objets en Javascript sont dynamiques et peuvent se voir attribuer de nouvelles propriétés. Une "carte" comme vous y parlez n'est en fait qu'un objet vide. Un Array est également un objet, avec des méthodes telles que
slice
et des propriétés telles quelength
.la source
Si vous avez besoin de faire une copie complète d'une carte, vous pouvez utiliser les éléments suivants:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Où se
source
trouve l'objet Map d'origine.Notez que cela peut ne pas convenir à tous les cas d'utilisation où les valeurs de la carte ne sont pas sérialisables, pour plus de détails, voir: https://stackoverflow.com/a/122704/10583071
la source
deep copy
cible,Map
c'est juste unshallow copy
. C'est peut-être pourquoi c'est si rapide?J'ai remarqué que Map devrait nécessiter un traitement spécial, donc avec toutes les suggestions de ce fil, 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 || "string" == 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; }
la source
Une manière nouvelle et élégante de faire cela:
var map1 = {"a": "b"}; var map2 = {...map1};
la source