¿Cómo clono / copio un mapa en JavaScript?
Sé cómo clonar una matriz, pero ¿cómo clono / copio un mapa?
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
fuente
fuente
let copy = {...myMap};
Respuestas:
Una forma sencilla (de hacer una copia superficial) es copiar cada propiedad del mapa de origen en el mapa de destino:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
fuente
Con la introducción de Maps en JavaScript es bastante simple considerando que el constructor acepta un iterable:
var newMap = new Map(existingMap)
Documentación aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
fuente
Map.prototype.entries
yMap.prototype.set
. Eso significa: si escribe una clase que extiende Map y sobrescribe cualquiera de estos dos métodos, entonces la simple escrituranew ExtendedMap( extendedMapObj )
no funcionará si los métodos extendidos se basan en propiedades que no están disponibles para el super.var newMap = new Map(existingMap)
esO(n)
dónden
está el número de pares clave / valor del mapa? Supongo que la operación de clonación no es constanteO(1)
si, como dices,Map.prototype.entries
se llama bajo el capó ...Es muy sencillo clonar un mapa ya que de lo que estás hablando es solo un objeto. Hay un
Map
en ES6 que debe buscar, pero para copiar un objeto, simplemente useObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
También puede utilizar
cloneDeep()
desde Lodashlet copy = cloneDeep(map);
fuente
JQuery tiene un método para extender un objeto (fusionando dos objetos), pero este método también se puede usar para clonar un objeto proporcionando un objeto vacío.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Se puede encontrar más información en la documentación de jQuery .
fuente
No hay nada integrado.
Utilice una copiadora de propiedades recursiva bien probada o, si el rendimiento no es un problema, serialice en JSON y vuelva a analizar en un nuevo objeto.
fuente
No hay clonación / copia incorporada. Puede escribir su propio método en una copia superficial o profunda:
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; }
Todos los objetos en Javascript son dinámicos y se les pueden asignar nuevas propiedades. Un "mapa", como usted lo denomina, es en realidad un objeto vacío. Una matriz también es un objeto, con métodos como
slice
y propiedades comolength
.fuente
Si necesita hacer una copia profunda de un mapa, puede utilizar lo siguiente:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Dónde
source
está el objeto Mapa original?Tenga en cuenta que esto puede no ser adecuado para todos los casos de uso en los que los valores del mapa no se pueden serializar; para obtener más detalles, consulte: https://stackoverflow.com/a/122704/10583071
fuente
deep copy
objetivoMap
, es solo unshallow copy
. ¿Quizás por eso es tan rápido?Noté que Map debería requerir un tratamiento especial, por lo tanto, con todas las sugerencias en este hilo, el código será:
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; }
fuente
Una forma nueva y elegante de hacer esto:
var map1 = {"a": "b"}; var map2 = {...map1};
fuente