Библиотека Idb-keyval предоставляет удобный способ работы с IndexedDB через упрощённый API для хранения и извлечения данных. Одной из часто встречающихся задач является организация сложных ключей, позволяющих структурировать данные по уровням, аналогично вложенным объектам. Использование составных ключей через разделители позволяет создавать иерархические структуры без необходимости дополнительной индексации.
Составной ключ представляет собой строку, объединяющую несколько
частей с помощью определённого разделителя. Чаще всего используется
символ : или /, хотя библиотека не накладывает
ограничений на выбор разделителя. Пример:
import { set, get } from 'idb-keyval';
const key = 'user:123:settings:theme';
await set(key, 'dark');
const theme = await get('user:123:settings:theme');
console.log(theme); // 'dark'
Здесь ключ 'user:123:settings:theme' состоит из четырёх
сегментов:
user — категория.123 — идентификатор пользователя.settings — подкатегория.theme — конкретный параметр.Такой подход позволяет легко фильтровать и манипулировать данными, если использовать дополнительную логику обработки ключей.
Для упрощения работы с составными ключами удобно создавать универсальные функции:
function makeKey(...segments) {
return segments.join(':');
}
// Использование
const userThemeKey = makeKey('user', '123', 'settings', 'theme');
await set(userThemeKey, 'light');
const theme = await get(userThemeKey);
console.log(theme); // 'light'
Функция makeKey обеспечивает единообразие формирования
ключей и уменьшает риск ошибок при ручной сборке строк.
Idb-keyval не поддерживает нативные запросы по шаблону ключей, но
можно реализовать обход всех ключей через
IDBKeyVal.keys():
import { keys, get } from 'idb-keyval';
async function getByPrefix(prefix) {
const allKeys = await keys();
const matchedKeys = allKeys.filter(key => key.startsWith(prefix));
const results = {};
for (const key of matchedKeys) {
results[key] = await get(key);
}
return results;
}
// Пример
const userSettings = await getByPrefix('user:123:settings');
console.log(userSettings);
Эта функция позволяет собрать все значения, относящиеся к определённой категории, создавая псевдо-иерархический доступ к данным.
Использование составных ключей позволяет хранить данные, которые по своей сути являются вложенными объектами:
await set(makeKey('user', '123', 'profile', 'name'), 'Алексей');
await set(makeKey('user', '123', 'profile', 'age'), 30);
const name = await get(makeKey('user', '123', 'profile', 'name'));
const age = await get(makeKey('user', '123', 'profile', 'age'));
console.log({ name, age }); // { name: 'Алексей', age: 30 }
При необходимости можно динамически формировать ключи на основе данных или схемы объекта.
Выбор разделителя зависит от особенностей проекта:
: — привычный и читаемый для большинства случаев./ — подходит, если данные предполагается
синхронизировать с URL или путями файловой системы.. — часто используется для отображения вложенных
объектов (user.123.settings.theme).Важно избегать разделителей, которые могут присутствовать в значениях сегментов, чтобы не возникало путаницы при разборе ключа.
Использование составных ключей через разделители в Idb-keyval открывает возможности для организации сложных иерархий данных, упрощает управление и выборку по категориям, и делает работу с IndexedDB более структурированной и удобной. Универсальные функции генерации ключей и методы фильтрации по префиксу становятся мощными инструментами при построении масштабируемых клиентских приложений.