Как клонировать / копировать карту в JavaScript?
Я знаю, как клонировать массив, но как клонировать / копировать карту?
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
сазр
источник
источник
let copy = {...myMap};
Ответы:
Простой способ (сделать неглубокую копию) - скопировать каждое свойство исходной карты в целевую карту:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
источник
С введением Maps в JavaScript это довольно просто, учитывая, что конструктор принимает итерацию:
var newMap = new Map(existingMap)
Документация здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
источник
Map.prototype.entries
иMap.prototype.set
. Это означает: если вы напишете класс, который расширяет Map и перезаписывает любой из этих двух методов, то простая записьnew ExtendedMap( extendedMapObj )
не будет работать, если расширенные методы полагаются на свойства, которые недоступны для super.var newMap = new Map(existingMap)
- этоO(n)
гдеn
количество пар ключ / значение карты? Я предполагаю, что операция клонирования непостоянна,O(1)
если, как вы говорите,Map.prototype.entries
вызывается под капотом ...Очень просто клонировать карту, поскольку то, о чем вы говорите, - это просто объект. В
Map
ES6 есть пункт, который вы должны найти, но чтобы скопировать объект, просто используйтеObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Вы также можете использовать
cloneDeep()
из Lodashlet copy = cloneDeep(map);
источник
В JQuery есть метод расширения объекта (слияние двух объектов), но этот метод также можно использовать для клонирования объекта, предоставив пустой объект.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Дополнительную информацию можно найти в документации jQuery .
источник
Нет ничего встроенного.
Либо используйте хорошо протестированный рекурсивный копировщик свойств, либо, если производительность не является проблемой, сериализуйте его в JSON и снова выполните синтаксический анализ для нового объекта.
источник
Встроенного клона / копии нет. Вы можете написать свой собственный метод для мелкой или глубокой копии:
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; }
Все объекты в Javascript являются динамическими, и им можно назначать новые свойства. «Карта», как вы ее называете, на самом деле является просто пустым объектом. Массив также является объектом с такими методами
slice
и свойствами, какlength
.источник
Если вам нужно сделать полную копию карты, вы можете использовать следующее:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
куда
source
находится исходный объект Map.Обратите внимание, что это может не подходить для всех случаев использования, когда значения карты не сериализуемы, для получения дополнительной информации см .: https://stackoverflow.com/a/122704/10583071
источник
deep copy
целевого объекта,Map
это просто объектshallow copy
. Может поэтому так быстро?Я заметил, что Map требует особого обращения, поэтому со всеми предложениями в этой ветке код будет:
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; }
источник
Новый и элегантный способ сделать это:
var map1 = {"a": "b"}; var map2 = {...map1};
источник