Клонировать/скопировать экземпляр карты
Как мне клонировать/скопировать карту в 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();
Ответы
Ответ 1
Простой способ (сделать поверхностную копию) - скопировать каждое свойство исходной карты на целевую карту:
var newMap = {};
for (var i in myMap)
newMap[i] = myMap[i];
ПРИМЕЧАНИЕ. NewMap [i] вполне может быть ссылкой на тот же объект, что и myMap [i].
Ответ 2
С введением Maps в JavaScript это довольно просто, учитывая, что конструктор принимает итерацию:
var newMap = new Map(existingMap)
Документация здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
Ответ 3
JQuery имеет метод расширения объекта (слияние двух объектов), но этот метод также можно использовать для клонирования объекта путем предоставления пустого объекта.
// Shallow copy
var newObject = jQuery.extend({}, oldObject);
// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Более подробную информацию можно найти в документации jQuery.
Ответ 4
Очень просто клонировать карту, так как то, о чем вы говорите, просто объект. В ES6 есть Map
, который нужно искать, но чтобы скопировать объект, просто используйте Object.assign()
let map = {"a": 1, "b": 2}
let copy = Object.assign({}, map);
Вы также можете использовать cloneDeep()
из Lodash
let copy = cloneDeep(map);
Ответ 5
Нет встроенного клона/копии. Вы можете написать свой собственный метод как для мелкой, так и для глубокой копии:
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
.
Ответ 6
Нет ничего встроенного.
Используйте либо хорошо протестированный рекурсивный копир свойств, либо если производительность не является проблемой, выполните сериализацию в JSON и снова проанализируйте новый объект.
Ответ 7
Я заметил, что Карта должна требовать специального лечения, поэтому со всеми предложениями в этом потоке код будет:
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;
}
Ответ 8
Если вам нужно сделать глубокую копию карты, вы можете использовать следующее:
new Map(JSON.parse(JSON.stringify(Array.from(source.entries()))));
Обратите внимание, что это может не подходить для всех случаев использования, когда значения Map не сериализуемы, для получения дополнительной информации см.: fooobar.com/info/97/...