Start · Sprachen · JavaScript · Referenz · IDBKeyRange.includes()

IDBKeyRange.includes()

Methode

Prüft, ob ein Schlüssel innerhalb des Schlüsselbereichs liegt, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript Baseline: alle modernen Browser (Chrome 52+, Firef Kategorie: webapi

Signatur

IDBKeyRange.prototype.includes(key)

Beschreibung

Mit includes() prüfen Sie direkt in JavaScript, ob ein bestimmter Schlüssel in einem IDBKeyRange liegt. Die Methode vergleicht nach denselben Regeln wie IndexedDB selbst (siehe indexedDB.cmp()). Beachtet werden die Grenzen lower und upper und ebenso lowerOpen und upperOpen. Diese beiden Angaben legen fest, ob die Grenze selbst noch zum Bereich gehört.

Nützlich ist das, wenn die Daten schon im Speicher liegen, etwa in einem Cache oder als Ergebnis von getAll(). Dann filtern Sie sie mit genau dem Bereich, den Sie auch für Datenbankabfragen verwenden. Sie legen einen Bereich also nur einmal fest und nutzen ihn an beiden Stellen. So kann es nicht passieren, dass Ihr eigener Vergleich im Speicher andere Ergebnisse liefert als die Datenbank.

Die Methode braucht weder eine offene Datenbank noch eine Transaktion. Sie läuft synchron, greift nicht auf die Datenbank zu und gibt direkt einen boolean zurück.

Der Vergleich folgt der Sortierreihenfolge von IndexedDB: Number < Date < String < binäre Daten < Array. Strings werden nach ihren UTF-16-Codeeinheiten verglichen, nicht nach den Regeln einer Sprache oder eines Gebietsschemas.

Parameter

Name Typ Default Beschreibung
$key Pflicht number|string|Date|ArrayBuffer|ArrayBufferView|Array Der zu prüfende Schlüssel. Er muss ein gültiger IndexedDB-Schlüssel sein, sonst wird ein DataError ausgelöst.

Beispiele

Offene und geschlossene Grenzen prüfen

// 10 gehört dazu, 20 nicht (upperOpen = true)
const range = IDBKeyRange.bound(10, 20, false, true);

console.log(range.includes(10)); // untere Grenze, geschlossen
console.log(range.includes(15));
console.log(range.includes(20)); // obere Grenze, offen
console.log(range.includes(25));
true true false false

Cache-Daten mit demselben Bereich filtern wie die Datenbankabfrage

// Datumsbereich für Bestellungen im Januar 2024
const januar = IDBKeyRange.bound(
  new Date('2024-01-01'),
  new Date('2024-02-01'),
  false,
  true
);

// Bereits im Speicher vorhandene Datensätze
const cache = [
  { id: 1, datum: new Date('2023-12-31') },
  { id: 2, datum: new Date('2024-01-15') },
  { id: 3, datum: new Date('2024-02-01') }
];

const treffer = cache.filter((b) => januar.includes(b.datum));
console.log(treffer.map((b) => b.id));

// Derselbe Bereich lässt sich direkt für eine Abfrage nutzen:
// store.index('datum').getAll(januar);
[2]

Präfixsuche bei Strings und Umgang mit ungültigen Schlüsseln

// Alle Schlüssel, die mit 'user:' beginnen
const prefix = 'user:';
const range = IDBKeyRange.bound(prefix, prefix + '\uffff');

console.log(range.includes('user:42'));
console.log(range.includes('admin:1'));

try {
  range.includes({ id: 1 }); // Objekte sind keine gültigen Schlüssel
} catch (err) {
  console.log(err.name);
}
true false DataError

// Wichtig · Fallstricke

  • Ungültige Schlüssel: Bei Werten wie undefined, null, NaN, true oder einfachen Objekten löst includes() einen DOMException vom Typ DataError aus. Es wird also nicht einfach false zurückgegeben. Unsichere Eingaben sollten Sie deshalb in try...catch einschließen.
  • Typreihenfolge: Schlüssel verschiedener Typen gelten nie als gleich. So liegt '15' (String) nicht in IDBKeyRange.bound(10, 20), weil Strings immer größer als Zahlen sind.
  • String-Vergleich: Strings werden nach ihren Codeeinheiten verglichen, nicht nach Sprache oder Gebietsschema. Deshalb gilt 'Z' < 'a'. Auch Umlaute werden nicht so einsortiert, wie man es aus dem Deutschen erwartet.
  • Kompatibilität: Alle aktuellen Browser unterstützen die Methode, ebenso Web Worker. Sehr alte Browser (vor 2016–2017) kennen sie nicht. Dort können Sie sie mit indexedDB.cmp() nachbauen.
  • Performance: Der Aufruf ist synchron und leicht. Bei sehr großen Datenmengen ist eine Abfrage mit dem Bereich direkt in der Datenbank trotzdem meist schneller, als erst alles zu laden und dann im Speicher zu filtern.