克隆/复制Javascript地图变量

saz*_*azr 62 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(); 
Run Code Online (Sandbox Code Playgroud)

小智 237

随着JavaScript中的Maps的引入,考虑到构造函数接受一个iterable,这很简单:

var newMap = new Map(existingMap)
Run Code Online (Sandbox Code Playgroud)

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

  • 这将进行浅复制,而不是深复制:https://jsfiddle.net/jormwe69/ (8认同)
  • @PeterCoester我们可以说`var newMap = new Map(existingMap)`的渐近是`O(n)`,其中`n`是映射的键/值对的数量?我猜想,如果正如您所说,在幕后调用“Map.prototype.entries”,则克隆操作不是恒定的“O(1)”... (3认同)
  • 上面的一个小警告:克隆这样的地图,将调用Map.prototype.entries和Map.prototype.set。这意味着:如果您编写了一个扩展Map的类,并且_and_覆盖了这两个方法中的任何一个,那么如果扩展方法依赖于上级不可用的属性,那么简单地编写`new ExtendedMap(extendedMapObj)`将不起作用。 (2认同)

rob*_*rob 12

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

var newMap = {};
for (var i in myMap)
   newMap[i] = myMap[i];
Run Code Online (Sandbox Code Playgroud)

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

  • 这只是一个浅层副本......如果myMap [i]是一张地图呢? (4认同)
  • 我知道,但我认为你应该首先在你的答案中写下这个;-) (3认同)
  • 这不是Map而是Object.小而微不足道的差异.比照 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map (3认同)
  • 它不会复制您无权访问 setter 和 getter 的每个属性,因为它只是一个对象 (2认同)

小智 8

如果您需要制作地图的深层副本,可以使用以下命令:

new Map(JSON.parse(JSON.stringify(Array.from(source))));
Run Code Online (Sandbox Code Playgroud)

source原来的Map对象在哪里。

请注意,这可能并不适合 Map 值不可序列化的所有用例,有关更多详细信息,请参阅:/sf/answers/8589311/

  • @ZackBurt可悲的是,您提出的更快的替代方案并没有真正创建目标“Map”的“深层副本”,它只是一个“浅层副本”。也许这就是它这么快的原因? (3认同)

Jos*_*ell 7

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

let map = {"a": 1, "b": 2}
let copy = Object.assign({}, map);
Run Code Online (Sandbox Code Playgroud)

您也可以cloneDeep()从Lodash 使用

let copy = cloneDeep(map);
Run Code Online (Sandbox Code Playgroud)


Pas*_*nes 6

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

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

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);
Run Code Online (Sandbox Code Playgroud)

可以在jQuery文档中找到更多信息.