克隆/复制Map实例

时间:2011-11-21 03:38:09

标签: javascript

如何在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(); 

7 个答案:

答案 0 :(得分:190)

随着JavaScript中的地图的引入,考虑到构造函数接受可迭代的内容,它非常简单:

var newMap = new Map(existingMap)

此处的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

答案 1 :(得分:9)

一种简单的方法(进行浅层复制)是将源地图的每个属性复制到目标地图:

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

注意:newMap [i]很可能是对myMap [i]

的同一个对象的引用

答案 2 :(得分:4)

克隆地图非常简单,因为你所谈论的只是一个对象。您应该查找ES6中的Map,但要复制对象,只需使用Object.assign()

let map = {"a": 1, "b": 2}
let copy = Object.assign({}, map);

您也可以使用Lodash的cloneDeep()

let copy = cloneDeep(map);

答案 3 :(得分:2)

没有内置克隆/副本。您可以将自己的方法编写为浅层或深层副本:

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等属性。

答案 4 :(得分:1)

我注意到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;
}

答案 5 :(得分:0)

如果您需要复制地图的深层副本,可以使用以下内容:

new Map(JSON.parse(JSON.stringify(Array.from(source))));

source是原始Map对象。

请注意,这可能不适用于Map值不可序列化的所有使用情况,有关更多详细信息,请参见:https://stackoverflow.com/a/122704/10583071

答案 6 :(得分:-1)

一种新颖而优雅的方法:

var map1 = {"a": "b"};
var map2 = {...map1};