如何在javascript中序列化地图?

Pav*_*kov 11 javascript

所以......在js中有这种类型被称为Map,它真的很好......它比迭代和计算的对象更快,所以我真的很喜欢它。但是……您不能像处理对象那样传递 Maps。

我知道我可以将 Map 转换为 JSON,但这样做的成本很高,而且它首先失去了使用 Maps 的意义。

JSON 格式不适用于地图……它适用于对象。

所以...让我们从 JSON 格式稍微移动一下。

有没有办法让我以Map任何方式将 a序列化为一个字符串,以便我可以做相反的事情 - 从所说的序列化Map到最终得到一个Map

最好这种方法应该JSON.stringify和它的对应方法一样容易执行JSON.parse

我想使用Map它,因为它更快更好,但我需要将我的数据作为字符串发送。字符串的格式并不重要,只要我能把它解析回Map

asi*_*iby 14

-- 编辑:在序列化过程中添加了缺少的 JSON Stringify 函数-

在 Javascript 中有一种本地方式可以做到这一点。

Map 对象有一个称为entries() 的方法,该方法返回一个迭代器,该迭代器将映射中的每个条目作为一个数组生成,其中包含2 个值。它看起来像 [key, value]。

为了避免自己编写任何循环代码,您可以使用Array.from()which 可以使用迭代器并从中提取每个项目。有了这个,下面将以序列化形式为您提供 Map 对象。

let mySerialMap = JSON.stringify(Array.from(myMap.entries()))
console.log(mySerialMap)
Run Code Online (Sandbox Code Playgroud)

现在,这还不是最酷的部分。但在到达那里之前,让我向您展示使用Map构造函数的一种可能方法。

let original = new Map([
  ['key1', 'the-one-value']
  ['second-key, 'value-two']
])
Run Code Online (Sandbox Code Playgroud)

您可以看到传递给Map对象的数组数组与您从 using 中获得的格式相同Array.from(myMap.entries())

因此,您可以使用以下示例代码在一行中重建您的地图:

let myMap = new Map(JSON.parse(mySerialMap))
Run Code Online (Sandbox Code Playgroud)

您可以myMap像使用任何Map.

let myMap = new Map(JSON.parse(mySerialMap))
let first = myMap.get('some-key')
myMap.set('another-key', 'some value')
Run Code Online (Sandbox Code Playgroud)


phi*_*ipp 7

我想 Maps/Dictionaries 的全部意义在于您可以使用对象作为其中的键,因此:

let a = {}, b = {}, m = new Map();

m.set(a,b);
m.get(a); // b
Run Code Online (Sandbox Code Playgroud)

所以,你得到b,因为你有一个参考a。假设您通过创建一个数组数组来序列化 Map,并将其字符串化为 json:

function serialize (map) {
  return JSON.stringify([...map.entries()])
}

let s = serialize(m); // '[[{}, {}]]'
                      // '[[<key>, <val>], … ]'
Run Code Online (Sandbox Code Playgroud)

比你可以:

let m2 = JSON.parse(s).reduce((m, [key, val])=> m.set(key, val) , new Map());
Run Code Online (Sandbox Code Playgroud)

但现在的问题是:如何获得某个密钥?由于不存在任何引用,由于所有对象都已被字符串化和重新创建,因此无法查询专用键。

所以所有这些只适用于 String 键,但这确实需要映射的大部分功能,或者换句话说,将它们简化为简单的对象,实现映射的原因是什么。

  • 它们比仅仅能够使用对象作为键有更多的实用性它们具有数组有序的优点以及对象中键的优点,因此您可以通过键从 Map 中获取项目,无论该项目是对象还是对象一个字符串,您可以循环一个 Map 并确保项目的顺序正确。 (2认同)