使用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。我可以直接存储地图对象吗?
答案 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
调用结束后加载一段时间。