繁体   English   中英

检查包含保存在 chrome.storage.local 中的对象数组的对象中的键

[英]Checking for a key in an object containing array of objects saved in chrome.storage.local

我目前将一堆对象(数千个)保存到 chrome.storage.local 中,然后在特定网页上检查网页上的特定 ID 是否实际上保存在本地存储中。

这是一个伪代码

背景脚本:

var storage = chrome.storage.local;

var json = '[{"kek1": {"aaa": "aaaValue", "bbb": "bbbValue", "ccc": "cccValue"}},{"kek2": {"ddd": "dddValue", "eee": "eeeValue", "fff": "fffValue"}}]';
var jsonParsed = JSON.parse(json);
jsonParsed.forEach(function(object) {
    storage.set(object);
});

内容脚本(在特定页面上时):

ids.forEach(function(id) {
    storage.get(id, function(result){
        if(!isEmpty(result)) {
            //we found it, nice, now flag it as found
        }
    });
});

function isEmpty(obj) {
    for(var key in obj) {
        if(obj.hasOwnProperty(key))
            return false;
    }
    return true;
}

这既简单又好,因为我只需要执行storage.get(id, ...

不幸的是,我在存储中保存了很多东西,其中一些我需要定期删除,然后变得很麻烦,因为我必须遍历所有对象并确定该特定对象是需要删除还是需要保留.

所以我决定我会喜欢这些“父对象”。 即一个用于设置的对象,包含一组具有用户将保存的不同设置的对象。 需要删除的东西的一个对象,包含一个数组对象。 等等

像这样 - 我想定期删除的所有相关信息都将在一个键“测试”(临时名称)下:

var json = '{"test":[{"kek1": {"aaa": "aaaValue", "bbb": "bbbValue", "ccc": "cccValue"}},{"kek2": {"ddd": "dddValue", "eee": "eeeValue", "fff": "fffValue"}}]}';

我知道如何访问嵌套对象及其值:

var jsonParsed = JSON.parse(json);
jsonParsed.test[0].kek1.aaa

但我不知道如何轻松检查存储中保存的密钥,因为我必须指定“元素编号”([i])。

我是否只是像这样对数组进行迭代?

for (i = 0; i < jsonParsed.test.length; i++) {
    var getKey = Object.keys(jsonParsed.test[i]);
    if (getKey[0] == 'theKeyImLookingFor') {
        //do stuff
    }
}

对我来说,这不是理想的解决方案,因为 for 循环必须针对页面上的每个 id 运行,有时可能接近 4000 个。 (4000 for 循环背靠背)

保存包含数千个其他对象的数组的单个对象是否是个好主意?

我做错了还是这是要走的路?

但我不知道如何轻松检查存储中保存的密钥

使用标准的 Array 方法,如findfindIndex

const i = arrayOfObjects.findIndex(o => 'someKey' in o);

保存包含数千个其他对象的数组的单个对象是否是个好主意?

在性能方面这是一个坏主意。

您在这里可能需要的是存储中的一个附加值,该值将包含一个数组,其中包含存储中需要以某种方式处理的其他值的 ID,例如过期/删除。 它基本上就像一个数据库索引,因此您每次编写单个对象时都会更新它。 由于它只包含 id,更新它比重写整个数据便宜。

此外,不要对 API 执行大量调用,只需执行一次调用:

// writing
chrome.storage.local.set(Object.assign({}, ...arrayOfObjects));

// reading
chrome.storage.local.get(arrayOfIds, data => {
  for (const id of arrayOfIds) {
    const value = data[id];
    if (value !== undefined) {
      // ok
    }
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM