Операция entries: получение пар ключ-значение

Метод entries библиотеки Idb-keyval предназначен для получения всех пар ключ-значение, которые находятся в хранилище IndexedDB. Этот метод возвращает итерируемый объект, который можно использовать в циклах или преобразовать в массив для дальнейшей обработки.

import { entries } from 'idb-keyval';

async function showEntries() {
    for await (const [key, value] of entries()) {
        console.log(key, value);
    }
}

В примере выше метод entries используется с циклом for await...of, что позволяет последовательно получать пары ключ-значение. Это особенно удобно для работы с асинхронными данными, поскольку entries возвращает асинхронный итератор.


Асинхронный итератор

Асинхронный итератор предоставляет возможность поэтапной загрузки данных из IndexedDB, что важно при работе с большими объёмами информации.

Особенности использования:

  • Каждая итерация возвращает массив из двух элементов: [ключ, значение].
  • Использование for await...of гарантирует, что данные будут обрабатываться по мере их извлечения, без блокировки основного потока.
  • Можно комбинировать с операторами деструктуризации для прямого доступа к ключам и значениям.

Пример:

for await (const [key, value] of entries()) {
    if (typeof value === 'object') {
        console.log(`Объект под ключом ${key}:`, value);
    } else {
        console.log(`Значение ${key}:`, value);
    }
}

Преобразование в массив

Для удобной работы с результатами можно преобразовать асинхронный итератор в массив, используя Array.from в сочетании с for await...of или Promise.all.

async function getAllEntries() {
    const allEntries = [];
    for await (const entry of entries()) {
        allEntries.push(entry);
    }
    return allEntries;
}

getAllEntries().then(console.log);

Альтернативный вариант с Promise.all:

const allEntries = await Promise.all([...entries()]);
console.log(allEntries);

Использование такого подхода позволяет быстро получить полный список всех ключей и значений, чтобы, например, отобразить их в интерфейсе или выполнить массовую обработку.


Фильтрация и обработка данных

Асинхронный итератор entries легко комбинировать с фильтрацией и другими методами обработки данных.

Пример фильтрации по ключу:

for await (const [key, value] of entries()) {
    if (key.startsWith('user_')) {
        console.log(`Пользовательские данные: ${key} →`, value);
    }
}

Пример преобразования значений перед сохранением в другой массив:

const transformed = [];
for await (const [key, value] of entries()) {
    transformed.push([key, JSON.stringify(value)]);
}
console.log(transformed);

Взаимодействие с другими методами Idb-keyval

Метод entries удобно сочетать с:

  • get и set — для выборочной обработки данных.
  • del — для удаления ключей, удовлетворяющих определённым условиям.
  • clear — после анализа всех записей можно решить, какие удалить полностью.

Пример удаления всех устаревших записей:

for await (const [key, value] of entries()) {
    if (value.expired) {
        await del(key);
    }
}

Особенности производительности

  • entries эффективно работает даже при большом объёме данных, так как IndexedDB оптимизирована для асинхронного чтения.
  • Асинхронная природа метода предотвращает блокировку основного потока.
  • Рекомендуется использовать фильтрацию на этапе итерации, чтобы не хранить лишние данные в памяти.

Советы по использованию

  1. Всегда использовать for await...of или Promise.all для корректной работы с асинхронным итератором.
  2. Преобразование итератора в массив удобно для анализа, но при очень больших данных может потребовать много памяти.
  3. Комбинировать entries с фильтрацией и условиями для уменьшения объёма обрабатываемых данных.
  4. Для сложных операций лучше создавать отдельные функции обработки, чтобы сохранить читаемость кода.

Метод entries предоставляет мощный и гибкий способ работы с IndexedDB через библиотеку Idb-keyval, обеспечивая поэтапное получение, фильтрацию и обработку пар ключ-значение без блокировки интерфейса и с минимальными затратами ресурсов.