Метод keys: получение всех ключей

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

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

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

localforage.keys()

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


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

После успешного выполнения Promise возвращает массив ключей:

[
    "user",
    "settings",
    "cart",
    "theme"
]

Пример:

localforage.keys()
    .then(function(keys) {
        console.log(keys);
    });

Результат:

["user", "settings", "cart", "theme"]

При использовании конструкции async/await:

async function showKeys() {
    const keys = await localforage.keys();

    console.log(keys);
}

Как работает keys()

localForage хранит данные в виде пар:

ключ → значение

Например:

await localforage.setItem("user", {
    name: "Alex"
});

await localforage.setItem("theme", "dark");

await localforage.setItem("language", "ru");

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

const keys = await localforage.keys();

вернёт:

[
    "user",
    "theme",
    "language"
]

При этом значения не загружаются. Метод получает только имена записей.


Получение всех ключей через Promise

Классический вариант использования:

localforage.keys()
    .then(function(keys) {
        keys.forEach(function(key) {
            console.log(key);
        });
    })
    .catch(function(err) {
        console.error(err);
    });

В консоли:

user
theme
language

Использование с async/await

Современный синтаксис делает код более читаемым:

async function printKeys() {
    try {
        const keys = await localforage.keys();

        for (const key of keys) {
            console.log(key);
        }
    } catch (error) {
        console.error(error);
    }
}

Проверка наличия данных

Метод keys() может использоваться для определения того, пусто ли хранилище.

Пример:

const keys = await localforage.keys();

if (keys.length === 0) {
    console.log("Хранилище пустое");
}

Если записи существуют:

if (keys.length > 0) {
    console.log("Данные найдены");
}

Получение количества записей через keys()

Хотя для этого существует специальный метод length(), иногда число записей вычисляют через keys():

const keys = await localforage.keys();

console.log(keys.length);

Например:

[
    "user",
    "settings",
    "theme"
]

Количество:

3

Однако при необходимости получить только число элементов предпочтительнее использовать метод length(), поскольку он выполняет задачу более эффективно.


Перебор всех записей через keys()

Часто возникает необходимость не только получить ключи, но и извлечь соответствующие значения.

Пример:

const keys = await localforage.keys();

for (const key of keys) {
    const value = await localforage.getItem(key);

    console.log(key, value);
}

Результат:

user {name: "Alex"}
theme dark
language ru

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


Формирование списка объектов

Иногда требуется собрать данные в единый массив.

Пример:

const keys = await localforage.keys();

const result = [];

for (const key of keys) {
    const value = await localforage.getItem(key);

    result.push({
        key,
        value
    });
}

console.log(result);

Результат:

[
    {
        key: "user",
        value: {
            name: "Alex"
        }
    },
    {
        key: "theme",
        value: "dark"
    }
]

Создание резервной копии данных

Метод keys() часто применяется для экспорта содержимого локального хранилища.

Пример:

async function exportStorage() {
    const keys = await localforage.keys();

    const backup = {};

    for (const key of keys) {
        backup[key] = await localforage.getItem(key);
    }

    return backup;
}

Возможный результат:

{
    user: {
        name: "Alex"
    },
    theme: "dark",
    language: "ru"
}

После этого объект можно сериализовать:

const data = await exportStorage();

const json = JSON.stringify(data);

Поиск ключей по шаблону

Метод keys() возвращает полный список ключей, который затем можно фильтровать.

Предположим, данные пользователей имеют префикс:

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

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

const keys = await localforage.keys();

const userKeys = keys.filter(key =>
    key.startsWith("user_")
);

console.log(userKeys);

Результат:

[
    "user_1",
    "user_2",
    "user_3"
]

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

Распространённой практикой является использование пространств имён внутри ключей.

Пример:

await localforage.setItem("product:101", {});
await localforage.setItem("product:102", {});
await localforage.setItem("product:103", {});
await localforage.setItem("user:1", {});

Фильтрация:

const keys = await localforage.keys();

const products = keys.filter(key =>
    key.startsWith("product:")
);

Результат:

[
    "product:101",
    "product:102",
    "product:103"
]

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

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

Например:

const keys = await localforage.keys();

const lastKey = keys[keys.length - 1];

console.log(lastKey);

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


Работа с несколькими экземплярами localForage

Если используются отдельные экземпляры хранилища, keys() работает только внутри конкретного экземпляра.

Создание двух хранилищ:

const usersStore = localforage.createInstance({
    name: "app",
    storeName: "users"
});

const productsStore = localforage.createInstance({
    name: "app",
    storeName: "products"
});

Сохранение данных:

await usersStore.setItem("user1", {});
await usersStore.setItem("user2", {});

await productsStore.setItem("product1", {});

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

const userKeys = await usersStore.keys();
const productKeys = await productsStore.keys();

Результат:

userKeys
// ["user1", "user2"]

productKeys
// ["product1"]

Каждый экземпляр работает со своим набором данных.


Обработка пустого хранилища

Если в базе нет записей:

await localforage.clear();

то вызов:

const keys = await localforage.keys();

console.log(keys);

вернёт:

[]

Ошибка при этом не возникает.


Возможные ошибки

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

Пример обработки:

try {
    const keys = await localforage.keys();

    console.log(keys);
} catch (error) {
    console.error("Ошибка получения ключей:", error);
}

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

Метод keys() возвращает полный список ключей хранилища.

Для небольших объёмов данных операция выполняется практически мгновенно:

const keys = await localforage.keys();

Однако при тысячах и десятках тысяч записей необходимо учитывать, что:

  • происходит обход всего хранилища;
  • создаётся массив всех ключей;
  • увеличивается потребление памяти;
  • возрастает время выполнения операции.

Если требуется обработка большого количества записей, более эффективным решением может быть использование метода iterate(), который позволяет обходить данные по одной записи без формирования полного массива ключей.


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

keys()

Возвращает:

[
    "user",
    "theme",
    "settings"
]

Пример:

const keys = await localforage.keys();

Подходит для:

  • получения списка записей;
  • фильтрации ключей;
  • проверки структуры данных;
  • поиска нужных идентификаторов.

iterate()

Позволяет сразу работать с содержимым:

await localforage.iterate((value, key) => {
    console.log(key, value);
});

Подходит для:

  • обхода больших объёмов данных;
  • поиска по значениям;
  • агрегации информации;
  • пакетной обработки записей.

Основные характеристики метода keys()

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