Фильтрация через values и entries

Библиотека Idb-keyval предоставляет удобный интерфейс для работы с IndexedDB через простые асинхронные методы. Основными инструментами для получения данных являются методы get, set, del, но для фильтрации большого объема информации особенно полезны методы values и entries.


Метод values

Метод values() возвращает асинхронный итератор всех значений, хранящихся в базе данных. Он позволяет обходить коллекцию значений без необходимости загружать весь объект в память сразу. Это особенно удобно при работе с большими объемами данных.

Синтаксис:

import { values } from 'idb-keyval';

for await (const value of values()) {
    console.log(value);
}
  • values() возвращает асинхронный итератор (AsyncIterable) значений.
  • Использование for await...of позволяет перебирать данные по мере их поступления из IndexedDB.
  • Асинхронный подход предотвращает блокировку основного потока.

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

import { values } from 'idb-keyval';

async function getFilteredValues(predicate) {
    const result = [];
    for await (const value of values()) {
        if (predicate(value)) {
            result.push(value);
        }
    }
    return result;
}

// Использование
const usersOver30 = await getFilteredValues(user => user.age > 30);
console.log(usersOver30);

В данном примере фильтруются объекты, где поле age больше 30. Такой подход позволяет создавать гибкие условия фильтрации без загрузки всей базы данных в память.


Метод entries

Метод entries() возвращает асинхронный итератор пар [ключ, значение]. Этот метод особенно полезен, когда необходимо не только значение, но и его ключ для последующих операций.

Синтаксис:

import { entries } from 'idb-keyval';

for await (const [key, value] of entries()) {
    console.log(key, value);
}
  • entries() предоставляет полный доступ к ключам и значениям.
  • Асинхронный итератор позволяет фильтровать данные “на лету” без создания массивов для всей базы.
  • Можно комбинировать фильтрацию по ключу и значению одновременно.

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

import { entries } from 'idb-keyval';

async function getFilteredEntries(keyPredicate, valuePredicate) {
    const result = [];
    for await (const [key, value] of entries()) {
        if (keyPredicate(key) && valuePredicate(value)) {
            result.push([key, value]);
        }
    }
    return result;
}

// Использование
const filtered = await getFilteredEntries(
    key => key.startsWith('user_'),
    user => user.active === true
);
console.log(filtered);

В этом примере выбираются только активные пользователи, чьи ключи начинаются с user_.


Применение фильтрации для больших данных

  • Асинхронные итераторы позволяют работать с большими объемами данных без загрузки их всех в память.
  • Методы values() и entries() совместимы с любыми пользовательскими структурами данных, включая объекты и массивы.
  • Фильтрацию можно комбинировать с сортировкой и агрегацией, используя промежуточные массивы или генераторы.

Пример комбинации фильтрации и подсчета:

import { values } from 'idb-keyval';

async function countActiveUsers() {
    let count = 0;
    for await (const user of values()) {
        if (user.active) count++;
    }
    return count;
}

const activeUserCount = await countActiveUsers();
console.log(activeUserCount);

Ключевые моменты использования

  • Асинхронность: все операции с values и entries работают асинхронно, что предотвращает блокировку интерфейса.
  • Фильтрация “на лету”: можно проверять каждое значение или пару [ключ, значение] по условию без создания полной копии базы.
  • Гибкость: фильтры могут быть любыми функциями-предикатами, возвращающими true или false.
  • Комбинации с другими методами: результаты можно дополнительно сортировать, группировать или преобразовывать с помощью стандартных методов массивов после сбора данных.

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