我如何在Chrome应用程序中存储地图对象

How can I store a Map object in a Chrome App?

本文关键字:存储 地图 对象 应用程序 Chrome      更新时间:2023-09-26

使用Chrome API Chrome .storage。在本地,我可以保存并成功检索数组,但不能检索Map对象。

var folders = new Map()
//... populate Map
chrome.storage.local.set( { "myFolders": folders } )
chrome.storage.local.get( "myFolders", function ( saved ) 
{
  console.assert( typeof saved.myFolders.size === 'number', "not a Map!" )
} )

我被迫在存储之前转换Map in Array。可以直接存储Map对象吗?

不,您不能存储或传递消息传递不可json序列化的对象(DOM节点是另一个常见的例子)。

且a Map不为

> JSON.stringify(new Map().set("a", "b"))
"{}"

因此,您只能存储JSON可以编码的内容。这意味着你必须在存储访问的基础上做你自己的序列化/反序列化。

编辑:正如Simon的回答所示,Chrome执行比JSON更精细的序列化(保留RegExp和Date),但原则仍然有效:非基本对象需要自定义序列化。

不能JSON。对Map进行字符串化,这样它就不会像预期的那样开箱即用。然而,问题是"如何"。这里是:

var folders = new Map()
//... populate Map
// save
chrome.storage.local.set(
  { "myFolders": Object.fromEntries(folders) }
)
// load
chrome.storage.local.get( "myFolders",
  function(saved){
    folders = new Map(Object.entries(result.myFolders));
    console.log(folders);
  }
)

请记住API是异步的,因此folders将在chrome.storage.local.get调用结束后加载。

查看文档:

原始值(如数字)将按预期序列化。值对于"object"类型,"function"通常会序列化为{},除了Array(按预期序列化)、Date和Regex(使用它们的字符串表示进行序列化)。

因此,如果不转换数据,就不能直接这样做