Como faço para clonar / copiar um mapa em JavaScript?
Eu sei como clonar uma matriz, mas como faço para clonar / copiar um 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
fonte
fonte
let copy = {...myMap};
Respostas:
Uma maneira simples (de fazer uma cópia superficial) é copiar cada propriedade do mapa de origem para o mapa de destino:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
fonte
Com a introdução do Maps em JavaScript é bastante simples, considerando que o construtor aceita um iterável:
var newMap = new Map(existingMap)
Documentação aqui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
fonte
Map.prototype.entries
eMap.prototype.set
. Isso significa: se você escrever uma classe que estende Map e sobrescreve um desses dois métodos, simplesmente escrevernew ExtendedMap( extendedMapObj )
não funcionará se os métodos estendidos dependerem de propriedades que não estão disponíveis para o super.var newMap = new Map(existingMap)
éO(n)
onden
está o número dos pares chave / valor do mapa? Eu acho que a operação de clonagem não é constanteO(1)
se, como você diz,Map.prototype.entries
é chamada sob o capô ...É muito simples clonar um mapa, pois o que você está falando é apenas um objeto. Existe um
Map
no ES6 que você deve procurar, mas para copiar um objeto, basta usarObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Você também pode usar
cloneDeep()
do Lodashlet copy = cloneDeep(map);
fonte
JQuery tem um método para estender um objeto (mesclando dois objetos), mas esse método também pode ser usado para clonar um objeto fornecendo um objeto vazio.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Mais informações podem ser encontradas na documentação do jQuery .
fonte
Não há nada embutido.
Use uma copiadora de propriedade recursiva bem testada ou, se o desempenho não for um problema, serialize para JSON e analise novamente para um novo objeto.
fonte
Não há clone / cópia embutido. Você pode escrever seu próprio método para cópia superficial ou 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 os objetos em Javascript são dinâmicos e podem receber novas propriedades. Um "mapa", como você se refere, é na verdade apenas um objeto vazio. Um Array também é um objeto, com métodos como
slice
e propriedades comolength
.fonte
Se você precisar fazer uma cópia profunda de um mapa, poderá usar o seguinte:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Onde
source
está o objeto Mapa original.Observe que isso pode não ser adequado para todos os casos de uso em que os valores do mapa não são serializáveis. Para obter mais detalhes, consulte: https://stackoverflow.com/a/122704/10583071
fonte
deep copy
do alvoMap
, é apenas umshallow copy
. Talvez seja por isso que é tão rápido?Percebi que o Map deve requerer um tratamento especial, portanto, com todas as sugestões neste thread, o 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; }
fonte
Uma maneira nova e elegante de fazer isso:
var map1 = {"a": "b"}; var map2 = {...map1};
fonte