使用 chrome.storage.local 存储数组

Posted

技术标签:

【中文标题】使用 chrome.storage.local 存储数组【英文标题】:Store an array with chrome.storage.local 【发布时间】:2013-05-12 10:11:48 【问题描述】:

我正在编写 chrome 扩展程序,但无法存储数组。我读到我应该使用 JSON stringify/parse 来实现这一点,但是使用它时出错。

chrome.storage.local.get(null, function(userKeyIds)
    if(userKeyIds===null)
        userKeyIds = [];
    
    var userKeyIdsArray = JSON.parse(userKeyIds);
    // Here I have an Uncaught SyntaxError: Unexpected token o
    userKeyIdsArray.push(keyPairId: keyPairId,HasBeenUploadedYet: false);
    chrome.storage.local.set(JSON.stringify(userKeyIdsArray),function()
        if(chrome.runtime.lastError)
            console.log("An error occured : "+chrome.runtime.lastError);
        
        else
            chrome.storage.local.get(null, function(userKeyIds)
                console.log(userKeyIds));
        
    );
);

如何存储像 keyPairId: keyPairId,HasBeenUploadedYet: false 这样的对象数组?

【问题讨论】:

不需要对其进行字符串化/解析。可以直接存储数组。 @BeardFist I have Uncaught TypeError: Object # has no method 'push' for the following code,这就是为什么我认为我应该对数组进行字符串化。 chrome.storage.local.get(null, function(userKeysIds) if(userKeysIds===null) userKeysIds = new Array(); userKeysIds.push(keyPairId: keyPairId,HasBeenUploadedYet: false); // ERROR chrome.storage.local.set(userKeysIds,function() ); ); 你使用keys获取和设置东西,当你得到它时,它是一个对象,例如chrome.storage.local.get('userKeyIds', function(stuff)console.log(stuff.userKeyIds);); 【参考方案1】:

我认为您将 localStorage 误认为是新的 Chrome Storage API。 - 如果是 localStorage,您需要 JSON 字符串 - 您可以使用 new Storage API

直接存储对象/数组
// by passing an object you can define default values e.g.: []
chrome.storage.local.get(userKeyIds: [], function (result) 
    // the input argument is ALWAYS an object containing the queried keys
    // so we select the key we need
    var userKeyIds = result.userKeyIds;
    userKeyIds.push(keyPairId: keyPairId, HasBeenUploadedYet: false);
    // set the new array value to the same key
    chrome.storage.local.set(userKeyIds: userKeyIds, function () 
        // you can use strings instead of objects
        // if you don't  want to define default values
        chrome.storage.local.get('userKeyIds', function (result) 
            console.log(result.userKeyIds)
        );
    );
);

【讨论】:

效果很好,非常感谢!以及默认值的好提示:) 没问题,很高兴我能帮上忙。 当我们将键设置为 userKeyIds 对象时,为什么最后会使用字符串的 'userKeyIds' 检索数据?代码似乎运行良好。 如果你想指定 默认值,getter 也接受一个对象chrome.storage.local.get('userKeyIds': [1,2,3], fn) 在这种情况下,fn 将被调用userKeyIds[1,2,3] 的值(如果尚不存在)。 但是,如果您不需要默认值,您可以简单地将要获取的键作为字符串或字符串数​​组传递(请参阅答案的代码)。 chrome.storage.local.get('userKeyIds', fn)chrome.storage.local.get(['userKeyIds', 'otherKey', 'yetAnotherKey'], fn)

以上是关于使用 chrome.storage.local 存储数组的主要内容,如果未能解决你的问题,请参考以下文章

window.localStorage 与 chrome.storage.local

chrome 扩展的“chrome.storage.local”数据保存在哪里?

使用 chrome set 缩小数组

Chrome 扩展:本地存储,如何导出

如何在Javascript中每24小时将变量重置为0?

Git 暂存文件列表