所以......在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)
我想 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 键,但这确实需要映射的大部分功能,或者换句话说,将它们简化为简单的对象,实现映射的原因是什么。