Подтвердить что ты не робот

Клонировать/скопировать экземпляр карты

Как мне клонировать/скопировать карту в 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(); 
4b9b3361

Ответ 1

Простой способ (сделать поверхностную копию) - скопировать каждое свойство исходной карты на целевую карту:

var newMap = {};
for (var i in myMap)
   newMap[i] = myMap[i];

ПРИМЕЧАНИЕ. NewMap [i] вполне может быть ссылкой на тот же объект, что и myMap [i].

Ответ 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/...