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

Javascript 如何在Chrome应用程序中存储地图对象?,javascript,google-chrome-extension,google-chrome-app,Javascript,Google Chrome Extension,Google Chrome App,使用Chrome API Chrome.storage.local,我可以保存并成功检索数组,但无法检索地图对象 var folders = new Map() //... populate Map chrome.storage.local.set( { "myFolders": folders } ) chrome.storage.local.get( "myFolders", function ( saved ) { console.assert( typeof saved.myFo

使用Chrome API Chrome.storage.local,我可以保存并成功检索数组,但无法检索地图对象

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!" )
} )

我必须在存储之前转换数组中的映射。我可以直接存储映射对象吗?

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

映射
不是:

> JSON.stringify(new Map().set("a", "b"))
"{}"
所以,你只能储存什么。这意味着您必须在存储访问的基础上进行自己的序列化/反序列化

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

好吧,请检查:

原始值(如数字)将按预期进行序列化。价值观 如果类型为“object”和“function”,则通常会序列化为{}, 数组(按预期序列化)、日期和正则表达式除外 (使用其字符串表示形式序列化)


因此,如果不转换数据,就无法直接执行此操作。

无法对映射进行JSON.stringify,因此它无法按预期的方式运行。然而,问题是“如何”,所以这里是:

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是异步的,因此
文件夹
将在
chrome.storage.local.get
调用结束后加载。

序列化实际上比JSON更糟糕。通常,通过
Date.prototype.toJSON
对日期对象进行序列化,但在存储API中,不会调用这些自定义序列化程序。日期对象(和RegExp)序列化为无用的
{}
值()。只有OWL可以回答这个问题