Manchmal ist beim Erstellen von Anwendungen die Leistung der Schlüssel oder zumindest ein wesentlicher Treiber, insbesondere wenn es um große Datenmengen oder Echtzeitanforderungen geht. Eine der häufigsten Aufgaben in JavaScript besteht darin, zu prüfen, ob in einer Sammlung ein Wert vorhanden ist. Die beiden am häufigsten verwendeten Alternativen sind Array.includes() und Set.has(). Beide funktionieren, aber tatsächlich funktioniert Set.has() besser als Array.includes. Lassen Sie uns die Gründe dafür untersuchen und entscheiden, wann Sie eine der beiden Alternativen verwenden sollten.
Es gibt zwei Methoden, die in ihrer Verwendung recht einfach zu sein scheinen, aber unterschiedliche Implementierungen haben, nämlich Array.includes() und Set.has().
Array.includes()
Die Methode Includes() prüft, ob ein bestimmter Wert in einem Array vorhanden ist.
Es nutzt die zeitliche Komplexität von O(n) aus, sodass die Wertprüfung umso länger dauert, je größer die Länge des Arrays ist.
Dies liegt daran, dass Array.includes() das Array von Anfang bis Ende durchsucht (oder bis der Wert gefunden wird) und je größer das Array ist, desto länger dauert es.
Set.has()
Die has()-Methode eines Sets prüft ebenfalls, ob ein bestimmter Wert vorhanden ist, geht aber viel schneller.
Set.has() basiert auf einer Hash-Tabellen-basierten Struktur, die eine zeitkonstante Suche oder O(1)-Zeitkomplexität ermöglicht.
Im Gegensatz zu Arrays ist Set für die Verarbeitung eindeutiger Werte konzipiert, sodass keine doppelten Werte enthalten sind und die Suchzeit länger ist.
Wenn Sie Set.has() verwenden, kann JavaScript das Element in einem direkten Vorgang finden, unabhängig davon, wie viele Elemente im Set enthalten sind. Wenn beispielsweise überprüft wird, ob sich ein Wert in einer Menge befindet, die eine Million enthält, ist der von Set.has() benötigte Zeitaufwand genau derselbe wie bei der Überprüfung von zehn.
Andererseits untersucht Array.includes() jedes Element der Reihe nach von links nach rechts, bis es entweder das gewünschte Element findet oder sein Ende erreicht. Das heißt, je länger die Größe ist, desto länger dauert die Überprüfung, insbesondere wenn ein Artikel kurz vor dem Ende steht – und auf jeden Fall, wenn der betreffende Artikel nicht mehr vorhanden ist.
Hier sehen Sie sich ein Beispiel genau an:
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
Wenn Sie dies ausführen, sehen Sie, dass Set.has() Array.includes() bei großen Arrays bei weitem übertrifft. In der Praxis könnte dieser Unterschied durchaus zu flüssigeren Animationen, schnelleren Ladezeiten oder sogar einer geringeren Ressourcennutzung auf Ihrem Server führen.
Das hängt alles davon ab, was Sie erreichen möchten. Hier eine kurze Zusammenfassung:
Verwenden Sie Set.has(), wenn:
Verwenden Sie Array.includes(), wenn:
Stellen Sie sich vor, Sie implementieren eine Benutzersuchfunktion, die Namen anhand einer Liste blockierter Wörter filtert. Wenn Sie Hunderte blockierter Wörter haben und häufig suchen, kann die Verwendung eines Satzes für die blockierten Wörter die Überprüfung jeder Suche beschleunigen:
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
Selbst in kleineren Fällen hilft ein Set dabei, die Dinge effizient und vorhersehbar zu halten. Und wenn die Liste blockierter Wörter wächst, verfügen Sie bereits über eine skalierbare Lösung.
Leistung: Set.has() bietet O(1)-Zeitkomplexität und ist damit viel schneller als Array.includes() mit O(n) für größere Sammlungen
Eignung: Das Set ist für eindeutige Werte konzipiert und daher natürlich für Suchvorgänge optimiert. Arrays sind bei doppelten Werten flexibler, prüfen jedoch langsamer, ob sie vorhanden sind.
Skalierbarkeit: Wenn Ihre Daten wachsen, funktioniert Set.has() weiterhin gut, während Array.includes() langsamer wird.
Es ist immer wichtig, die Größe und Art Ihres Datensatzes zu kennen, wenn Sie zwischen Set.has() und Array.includes() wählen. Array.includes() ist für kleine Datensätze vollkommen in Ordnung, aber Set.has() ist ein wertvolles Werkzeug in Situationen, in denen Geschwindigkeit entscheidend ist. Die richtige Datenstruktur kann dazu beitragen, Ihre JavaScript-Anwendungen schneller und effizienter zu optimieren, ohne große Änderungen an Ihrem Code vorzunehmen.
Wenn Sie also prüfen, ob etwas vorhanden ist, sollten Sie sich fragen: Ist das eine Aufgabe für ein Array oder kann ich die Leistung eines Sets nutzen? Es könnte durchaus der Unterschied sein, den Ihre Anwendung braucht, wenn Sie es richtig machen.
Das obige ist der detaillierte Inhalt vonWarum Set.has() beim Suchen von Elementen schneller ist als Array.includes(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!