Проверка ключа в объекте, содержащем массив объектов, сохраненных в chrome .storage.local - PullRequest
1 голос
/ 13 января 2020

В настоящее время я сохраняю кучу объектов (тысяч) в chrome .storage.local, а затем, когда на определенной веб-странице c проверяю, действительно ли указанные c идентификаторы на веб-странице действительно сохранены в локальной хранилище.

Вот псевдокод

Сценарий Bakcground:

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);
});

Сценарий содержимого (при указании на c странице):

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, ...

К сожалению, я сохраняю много вещей в хранилище, некоторые из них мне нужно периодически удалять, что затем становится суматохой, так как я должен провести l oop через все объекты и определить, должен ли этот конкретный объект быть удален или он должен остаться.

Поэтому я решил, что я бы сделал так, как эти "родительские объекты" , Ie один объект для настроек, содержащий массив объектов с разными настройками, которые пользователь может сохранить. Один объект для материала, который нужно удалить, содержащий массив объектов. Et c

Примерно так - вся необходимая информация, которую я хочу периодически удалять, будет находиться под одним ключом «test» (временное имя):

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]).

Должен ли я просто сделать a для l oop итерации по массиву, как это?

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

Мне кажется, что это не идеальное решение, так как для l oop придется запустить для каждого из идентификаторов на странице, и иногда может быть около 4000 из них. (4000 для циклов спина к спине)

Это хорошая идея, чтобы сохранить один объект, содержащий массив из тысяч других объектов?

Я делаю это неправильно или это способ go

1 Ответ

1 голос
/ 13 января 2020

Но я не знаю, как можно было бы легко проверить наличие ключей, сохраненных в хранилище

Использовать стандартные методы Array, например find или findIndex :

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

Хорошая идея сохранить один объект, содержащий массив из тысяч других объектов?

Это плохая идея -wise.

Здесь вам, вероятно, понадобится дополнительное значение в хранилище, которое будет содержать массив с идентификаторами других значений в хранилище, которые необходимо обработать некоторым способом, например, с истекшим сроком действия / удалением. Это в основном похоже на индекс базы данных, поэтому вы будете обновлять его каждый раз при написании отдельного объекта. Поскольку он содержит только идентификаторы, его обновление дешевле, чем перезапись всех данных.

Кроме того, вместо выполнения большого количества вызовов 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
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...