Signatur
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));
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);
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);
}
// Wichtig · Fallstricke
- Ungültige Schlüssel: Bei Werten wie
undefined,null,NaN,trueoder einfachen Objekten löstincludes()einenDOMExceptionvom TypDataErroraus. Es wird also nicht einfachfalsezurückgegeben. Unsichere Eingaben sollten Sie deshalb intry...catcheinschließen. - Typreihenfolge: Schlüssel verschiedener Typen gelten nie als gleich. So liegt
'15'(String) nicht inIDBKeyRange.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.