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

时间:2015-07-24 07:59:58

标签: javascript google-chrome-extension google-chrome-app

使用Chrome API chrome.storage.local,我可以保存并成功检索数组,但我无法检索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。我可以直接存储地图对象吗?

3 个答案:

答案 0 :(得分:4)

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

Map不是:

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

所以,你只能存储JSON can encode。这意味着您必须在存储访问的基础上进行自己的序列化/反序列化。

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

答案 1 :(得分:2)

好吧,检查documentation

  

数字等原始值将按预期序列化。值   使用typeof“object”和“function”通常会序列化为{},   除了Array(按预期序列化),Date和Regex之外   (使用String表示序列化)。

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

答案 2 :(得分:1)

您无法对 Map 进行 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 是异步的,因此 folders 将在 chrome.storage.local.get 调用结束后加载一段时间。