Метод key: получение ключа по индексу

Метод key() в библиотеке localForage предназначен для получения имени ключа по его порядковому индексу в хранилище. В отличие от методов, которые работают с конкретными ключами (getItem(), setItem(), removeItem()), данный метод позволяет обращаться к структуре хранилища как к коллекции элементов и получать ключи по их позиции.

Метод полезен в ситуациях, когда заранее неизвестны названия сохранённых записей и требуется последовательно перебрать содержимое базы данных.

Сигнатура метода выглядит следующим образом:

localforage.key(index)

где:

  • index — числовой индекс элемента;
  • возвращаемое значение — Promise, который содержит имя ключа либо null, если элемент отсутствует.

Принцип работы

Каждая запись в localForage состоит из двух частей:

  • ключа;
  • значения.

Например:

await localforage.setItem("user", { name: "Анна" });
await localforage.setItem("settings", { theme: "dark" });
await localforage.setItem("language", "ru");

После сохранения данных в хранилище находятся три записи:

Ключ Значение
user объект пользователя
settings настройки
language язык

Метод key() позволяет получить только имя ключа по его порядковому номеру:

const firstKey = await localforage.key(0);

console.log(firstKey);

Результат:

"user"

Возвращаемое значение

Метод возвращает Promise.

Пример:

localforage.key(0)
    .then(key => {
        console.log(key);
    });

Либо через современный синтаксис:

const key = await localforage.key(0);

console.log(key);

Если элемент существует:

"user"

Если индекс выходит за пределы диапазона:

null

Получение первого ключа

Наиболее простой сценарий использования — получение первого ключа.

const key = await localforage.key(0);

console.log(key);

Результат:

"user"

Индекс всегда начинается с нуля.


Получение нескольких ключей

Предположим, что хранилище содержит данные:

await localforage.setItem("user", {});
await localforage.setItem("settings", {});
await localforage.setItem("language", "ru");

Получение ключей:

console.log(await localforage.key(0));
console.log(await localforage.key(1));
console.log(await localforage.key(2));

Возможный вывод:

user
settings
language

Получение последнего ключа

Для нахождения последнего ключа удобно использовать метод length().

const count = await localforage.length();

const lastKey = await localforage.key(count - 1);

console.log(lastKey);

Если в хранилище пять элементов:

5

то индекс последнего элемента будет:

4

Проверка существования элемента по индексу

Поскольку key() возвращает null при отсутствии записи, можно легко проверить корректность индекса.

const key = await localforage.key(100);

if (key === null) {
    console.log("Элемент не найден");
}

Такой подход особенно полезен при динамическом обходе данных.


Перебор всех ключей через key()

Метод позволяет получить полный список ключей, если известно количество элементов.

const count = await localforage.length();

for (let i = 0; i < count; i++) {
    const key = await localforage.key(i);

    console.log(key);
}

Результат:

user
settings
language

Получение всех данных через key() и getItem()

Нередко требуется не только узнать ключи, но и получить связанные значения.

const count = await localforage.length();

for (let i = 0; i < count; i++) {
    const key = await localforage.key(i);
    const value = await localforage.getItem(key);

    console.log(key, value);
}

Пример результата:

user {name: "Анна"}
settings {theme: "dark"}
language ru

Формирование массива ключей

Метод можно использовать для создания списка всех ключей.

const count = await localforage.length();

const keys = [];

for (let i = 0; i < count; i++) {
    keys.push(await localforage.key(i));
}

console.log(keys);

Результат:

[
    "user",
    "settings",
    "language"
]

Получение ключей определённого типа

Если ключи имеют определённую структуру, их можно фильтровать.

Например:

await localforage.setItem("user_1", {});
await localforage.setItem("user_2", {});
await localforage.setItem("config", {});

Поиск пользовательских записей:

const count = await localforage.length();

const userKeys = [];

for (let i = 0; i < count; i++) {
    const key = await localforage.key(i);

    if (key.startsWith("user_")) {
        userKeys.push(key);
    }
}

console.log(userKeys);

Результат:

[
    "user_1",
    "user_2"
]

Использование вместе с removeItem()

Метод помогает удалять записи по индексам.

const key = await localforage.key(0);

if (key) {
    await localforage.removeItem(key);
}

Сначала определяется имя ключа, затем удаляется связанное значение.


Использование вместе с iterate()

Хотя для обхода данных обычно удобнее применять iterate(), иногда требуется именно доступ к индексам.

Пример комбинированного подхода:

const count = await localforage.length();

for (let i = 0; i < count; i++) {
    const key = await localforage.key(i);

    console.log(`Индекс: ${i}`);
    console.log(`Ключ: ${key}`);
}

Такой способ позволяет явно контролировать порядок обхода.


Особенности порядка элементов

Важно понимать, что порядок ключей зависит от используемого драйвера хранения:

  • IndexedDB;
  • WebSQL;
  • LocalStorage.

В большинстве случаев элементы возвращаются в порядке добавления, однако библиотека не гарантирует одинаковое поведение во всех реализациях и браузерах.

Поэтому не рекомендуется использовать индекс как постоянный идентификатор записи.

Нежелательный подход:

const user = await localforage.key(5);

с ожиданием, что шестой элемент всегда будет одним и тем же объектом.

После удаления или добавления записей порядок может измениться.


Обработка ошибок

Как и другие методы localForage, key() может завершиться ошибкой.

Использование конструкции try...catch:

try {
    const key = await localforage.key(0);

    console.log(key);
}
catch (error) {
    console.error(error);
}

Это особенно актуально при работе с IndexedDB и нестандартными ограничениями среды выполнения.


Сравнение key() и keys()

В библиотеке присутствуют два похожих метода:

Метод Назначение
key(index) получение одного ключа по индексу
keys() получение массива всех ключей

Пример key():

const key = await localforage.key(1);

Пример keys():

const keys = await localforage.keys();

Результат:

[
    "user",
    "settings",
    "language"
]

Если требуется один конкретный ключ по позиции, эффективнее использовать key().

Если нужен полный список ключей, удобнее применять keys().


Практический пример просмотра содержимого хранилища

async function showStorageContent() {
    const count = await localforage.length();

    for (let i = 0; i < count; i++) {
        const key = await localforage.key(i);
        const value = await localforage.getItem(key);

        console.log(`Запись №${i}`);
        console.log("Ключ:", key);
        console.log("Значение:", value);
        console.log("----------------");
    }
}

Возможный вывод:

Запись №0
Ключ: user
Значение: {name: "Анна"}

----------------

Запись №1
Ключ: settings
Значение: {theme: "dark"}

----------------

Запись №2
Ключ: language
Значение: ru

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