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