当前位置: 首页 > 知识库问答 >
问题:

如何在本地存储(或其他地方)中持久化ES6映射?

欧阳俊逸
2023-03-14
var a = new Map([[ 'a', 1 ]]);
a.get('a') // 1

var forStorageSomewhere = JSON.stringify(a);
// Store, in my case, in localStorage.

// Later:
var a = JSON.parse(forStorageSomewhere);
a.get('a') // TypeError: undefined is not a function

不幸的是JSON。严格化(a)只返回“{}”,这意味着在还原时a将变成空对象。

我发现es6 mapify允许在映射和普通对象之间进行上/下转换,所以这可能是一种解决方案,但我希望我需要借助外部依赖来保持映射。

共有3个答案

苏健柏
2023-03-14

通常,只有当此属性保持不变时,序列化才有用

deserialize(serialize(data)).get(key) ≈ data.get(key)

其中a≈ b可以定义序列化(a)==序列化(b)

将对象序列化为JSON时可以满足这一要求:

var obj1 = {foo: [1,2]},
    obj2 = JSON.parse(JSON.stringify(obj1));
obj1.foo; // [1,2]
obj2.foo; // [1,2] :)
JSON.stringify(obj1.foo) === JSON.stringify(obj2.foo); // true :)

这是因为属性只能是字符串,可以无损地序列化为字符串。

但是,ES6映射允许将任意值作为键。这是有问题的,因为对象是通过其引用而不是数据唯一标识的。序列化对象时,会丢失引用。

var key = {},
    map1 = new Map([ [1,2], [key,3] ]),
    map2 = new Map(JSON.parse(JSON.stringify([...map1.entries()])));
map1.get(1); // 2
map2.get(1); // 2 :)
map1.get(key); // 3
map2.get(key); // undefined :(

所以我想说,总的来说,用一种有用的方式做这件事是不可能的。

对于那些可以工作的情况,最有可能的是你可以使用一个普通的对象而不是地图。这还具有以下优点:

  • 它将能够在不丢失关键信息的情况下被串化到JSON。
  • 它将在旧的浏览器上工作。
  • 它可能更快。
龚宏壮
2023-03-14

干净利落:

JSON.stringify([...myMap])
严阳秋
2023-03-14

假设键和值都是可序列化的,

localStorage.myMap = JSON.stringify(Array.from(map.entries()));

应该管用。相反,使用

map = new Map(JSON.parse(localStorage.myMap));
 类似资料:
  • 问题内容: 不幸的是,简单地返回’{}’,这意味着a在还原后变成空对象。 我发现es6-mapify允许在Map和普通对象之间进行上/下转换,所以这可能是一种解决方案,但是我希望我仅需要使用外部依赖项来持久保存我的地图。 问题答案: 假设您的键和值都是可序列化的, 应该管用。反之,使用

  • 本地持久化卷允许用户通过标准 PVC 接口以简单便携的方式访问本地存储。PV 中包含系统用于将 Pod 安排到正确节点的节点亲和性信息。 一旦配置了本地卷,外部静态配置器(provisioner)可用于帮助简化本地存储管理。请注意,本地存储配置器与大多数配置器不同,并且尚不支持动态配置。相反,它要求管理员预先配置每个节点上的本地卷,并且这些卷应该是: Filesystem volumeMode(默

  • 问题内容: 我将创建一个或多或少具有以下形式的结构: 我想将这些值写入文件并在后续调用中读取它们。我最初的计划是将它们读入映射并使用键(路径)查找值(哈希和LastModified)。Go中有一种巧妙的方法吗? 如果没有,您可以推荐哪种文件格式?我已经阅读并尝试了先前项目中的一些键/值文件存储,但并未使用Go进行试验。现在,我的要求可能非常简单,因此大型数据库服务器系统会显得过大。我只想要我可以快

  • 本平台是通过storageclass来动态创建PV。也就是说咱们依赖于storageclass,如果您的Kubernetes不支持相应的存储试,将无法非常方便的进行挂载。 目前暂不支持挂载多个PVC,或许以后会更新吧。 这里演示的是用的NFS进行演示,实际使用时可根据自己的需求配置相应的provisioner,其他配置是一样的不需要调整,只需要在“模版管理” 调整StorageClass和Pers

  • 和RDD相似,DStreams也允许开发者持久化流数据到内存中。在DStream上使用persist()方法可以自动地持久化DStream中的RDD到内存中。如果DStream中的数据需要计算多次,这是非常有用的。像reduceByWindow和reduceByKeyAndWindow这种窗口操作、updateStateByKey这种基于状态的操作,持久化是默认的,不需要开发者调用persist(

  • localStorage 本地存储 存储针对QQ帐号隔离 数据存储于本地文件中。游戏结束后不会被删除 函数 key( index) 获取对应索引的key 手q 版本7.8.5 参数 参数名 类型 说明 index number 索引值 返回值 类型 说明 string 说明 示例 var stringKey = BK.localStorage.key(0); getItem( key) 获取ke