如何将一张地图复制到另一张地图?

如何用 JavaScript 克隆/复制 Map

我知道如何克隆一个数组,但是如何克隆/复制一个 Map呢?

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();
141920 次浏览

没有内置的(编辑: 很深)克隆/复制。您可以编写自己的方法到 不是肤浅就是深度复制:

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;
}

[编辑] 浅拷贝是内置的,使用 Object.assign:

let result = Object.assign({}, obj);

Javascript 中的所有对象都是动态的,可以分配新的属性。您所指的“ map”实际上只是一个空对象。Array 是 还有对象,带有诸如 slice之类的方法和诸如 length之类的属性。

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

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

注意: newMap [ i ]很可能是对与 myMap [ i ]相同的对象的引用

没有什么是内置的。

要么使用经过良好测试的递归属性复制器,要么如果性能不是问题,则序列化为 JSON 并再次解析为一个新对象。

JQuery 有一个方法来扩展一个对象(合并两个对象) ,但是这个方法也可以通过提供一个空对象来克隆一个对象。

// Shallow copy
var newObject = jQuery.extend({}, oldObject);


// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

更多信息可以在 JQuery 文档中找到。

随着 JavaScript 中 Maps 的引入,考虑到构造函数接受一个可迭代的:

var newMap = new Map(existingMap)

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

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

使用 Object.assign()非常简单

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


// Or


const copy = Object.assign({}, {'a': 1, 'b': 2});

如果你需要制作一个地图的深拷贝,你可以使用以下方法:

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

其中 source是原始 Map 对象。

注意,这可能不适合所有 Map 值不可序列化的用例,更多细节请参见: https://stackoverflow.com/a/122704/10583071