Start · Sprachen · JavaScript · Referenz · IDBKeyRange.lower

IDBKeyRange.lower

Eigenschaft

Schreibgeschützte Eigenschaft, die die untere Grenze eines <code>IDBKeyRange</code> zurückgibt, oder <code>undefined</code>, wenn der Bereich nach unten offen ist.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBKeyRange.prototype.lower

Beschreibung

Die Eigenschaft lower einer IDBKeyRange-Instanz gibt den Schlüssel zurück, mit dem der Bereich nach unten begrenzt ist. Welche Arten von Schlüsseln es gibt, legt IndexedDB fest: number, string, Date, ArrayBuffer bzw. typisierte Arrays sowie Arrays aus diesen Typen.

Das Ergebnis hängt davon ab, wie der Bereich erzeugt wurde:

  • IDBKeyRange.bound(lower, upper) und IDBKeyRange.lowerBound(lower): lower ist der übergebene untere Schlüssel.
  • IDBKeyRange.only(value): lower und upper sind beide value.
  • IDBKeyRange.upperBound(upper): Es gibt keine untere Grenze, deshalb ist lower gleich undefined.

Ob die Grenze selbst zum Bereich gehört, sagt lower nicht. Das steht in IDBKeyRange.lowerOpen. Beide Eigenschaften braucht man vor allem, wenn man vorhandene Bereiche prüfen, protokollieren oder in neue Bereiche umrechnen will, zum Beispiel beim seitenweisen Laden mit Cursorn.

Rückgabewert

Typ
number | string | Date | ArrayBuffer | Array | undefined
Beschreibung
Der untere Grenzschlüssel des Bereichs oder undefined, wenn der Bereich mit IDBKeyRange.upperBound() erzeugt wurde.

Beispiele

Untere Grenze verschiedener Bereiche auslesen

const range1 = IDBKeyRange.bound(10, 20, true, false);
const range2 = IDBKeyRange.only('anna');
const range3 = IDBKeyRange.upperBound(100);

console.log(range1.lower, range1.lowerOpen); // 10 true
console.log(range2.lower, range2.upper);     // anna anna
console.log(range3.lower);                   // undefined
10 true anna anna undefined

Bereich lesbar protokollieren (Debug-Hilfe)

const describeRange = (range) => {
  const left = range.lower === undefined
    ? '(-∞'
    : `${range.lowerOpen ? '(' : '['}${JSON.stringify(range.lower)}`;
  const right = range.upper === undefined
    ? '+∞)'
    : `${JSON.stringify(range.upper)}${range.upperOpen ? ')' : ']'}`;
  return `${left}, ${right}`;
};

console.log(describeRange(IDBKeyRange.bound('A', 'M', false, true)));
console.log(describeRange(IDBKeyRange.lowerBound(2024)));
["A", "M") [2024, +∞)

Seitenweises Laden: nächste Seite ab letztem Schlüssel

const loadPage = (db, range, pageSize = 20) => new Promise((resolve, reject) => {
  const store = db.transaction('artikel', 'readonly').objectStore('artikel');
  const items = [];
  const req = store.openCursor(range);
  req.onerror = () => reject(req.error);
  req.onsuccess = () => {
    const cursor = req.result;
    if (!cursor || items.length === pageSize) {
      // Die nächste Seite beginnt direkt hinter dem letzten Schlüssel (untere Grenze exklusiv)
      const lastKey = items.at(-1)?.id;
      const next = lastKey === undefined
        ? null
        : IDBKeyRange.lowerBound(lastKey, true);
      resolve({ items, next });
      return;
    }
    items.push(cursor.value);
    cursor.continue();
  };
});

// Nutzung (db ist eine geöffnete IDBDatabase mit keyPath 'id'):
// const { items, next } = await loadPage(db, IDBKeyRange.lowerBound(0));
// console.log('Nächste Seite ab >', next?.lower);

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an range.lower ändert nichts und wirft im Strict Mode einen TypeError. Um andere Grenzen zu bekommen, muss man einen neuen Bereich erzeugen, etwa mit IDBKeyRange.bound().
  • undefined heißt „nach unten offen“: Schlüssel können nie undefined sein. Mit range.lower === undefined kann man deshalb sicher prüfen, ob ein Bereich mit upperBound() erzeugt wurde.
  • Exklusiv oder inklusiv: lower liefert nur den Wert. Ob die Grenze selbst im Bereich liegt, zeigt lowerOpen.
  • Objektschlüssel: Bei Date- oder Array-Schlüsseln wird der gespeicherte Schlüssel wieder in einen JavaScript-Wert umgewandelt. Man sollte sich nicht auf Objektidentität (===) mit dem ursprünglich übergebenen Objekt verlassen. Zum Vergleichen eignet sich indexedDB.cmp().
  • Kompatibilität: Wird von allen modernen Browsern und in Web Workern unterstützt. In Node.js gibt es IndexedDB nicht von Haus aus, dafür braucht man z. B. fake-indexeddb.