首页 > 解决方案 > 在 javascript 中浅复制 Map 和 Set 对象,而无需在每个副本上加倍内存

问题描述

我正在使用 Map 数据结构,我需要制作现有 Map 对象的精确副本,而不会使内存使用量加倍。

如果我要使用数组或常规对象而不是 Map,则可以使用浅拷贝通过扩展运算符来完成此操作,这将允许我引用内存中的原始对象并根据需要使用额外的内存(仅当有任何更改时新对象)。

这是所需的行为,仅适用于 Map 对象。

这是我尝试过的:

    const shallowCopy = {
      storage: Object.assign({}, this.database.storage), //copying Map object
      counts: { ...this.database.counts },
    };

上述方法似乎会导致一个空对象,并且无法成功将 Map 复制过来。

同样,这里的主要目标是创建与普通对象的浅拷贝等价物let foo = {...bar},只有我使用的是 Map 对象......在复制之后我应该能够调用常规的 Map 函数复制..不确定这是否可能。

我感谢任何建议,在此先感谢

标签: javascriptecmascript-6ecmascript-5

解决方案


您可以使用该map.prototype.entries()方法并将其传递给Map构造函数以获取Map.

将在数组容器中返回一个带有andMap.prototype.entries的迭代器:keyvalue

//Sample Data
const childData = {
  name: "john",
  surname: "doe"
};

const data = {
  foo: "bar",
  baz: "foo",
  child: childData
};

//Constructing Map from Object
const map = new Map(Object.entries(data));

//Shallow copying the map object to a new Map object
const shallowCopyMap = new Map(map.entries());

printMapAsJson(shallowCopyMap);

//Modifying the object ref
childData.name = "jane";

//Change is reflected as it is a shallow copy
printMapAsJson(shallowCopyMap);

function printMapAsJson(map) {
  console.log(Object.fromEntries([...map.entries()]));
}


推荐阅读