Optimierung der Suche durch große js string-array?
wenn ich ein großes javascript-string-array, hat über 10.000 Elementen,
wie kann ich schnell durchsucht?
Momentan habe ich ein javascript-string-array, speichert die Beschreibung eines Jobs,
und ich"m so dass der Benutzer zum dynamischen filtern der zurückgegebenen Liste als Eingabe in ein Eingabefeld.
Also sagen, ich habe ein string-array wie folgt:
var descArr = {"flipping burgers", "pumping gas", "delivering mail"};
und der Benutzer möchte, um die Suche für: "p"
Wie ich wäre in der Lage zu suchen, ein string-array, 10000+ Beschreibungen in es schnell?
Offensichtlich kann ich nicht Sortieren Sie die Beschreibung array, da Sie Beschreibungen, so binäre Suche ist out. Und da kann der Benutzer die Suche durch "p"
oder "pi"
oder einer beliebigen Kombination von Buchstaben, diese Teil-Suche bedeutet, dass ich nicht verwenden kann assoziative arrays (d.h. searchDescArray["pumping gas"]
)
um die Suche zu beschleunigen.
Irgendwelche Ideen, jedermann?
- Sie wollen passen Sie die Suche am Anfang des strings oder innerhalb von Zeichenfolgen? Wenn der Benutzer die Suche nach "p", sollte es "flipping burgers" in die Ergebnis?
- descArr ist kein array, sondern ein Objekt-literal.
- Ja, wenn der Benutzer sucht nach "p" sollte es "flipping burgers" in die Folge. Ich finde, dass die größte slow down jetzt ist die eigentliche Suche. Aktuell habe ich einen forloop, dass er iteriert über das array und das tut dieser Vergleich: if (descArray[i].Suche("P")) > -1){ //Ergebnis zurückgeben}
- Tun Sie es mit RegExp - Beispiel: jsfiddle.net/RnabN/4 (30k Streicher, max 100 Ergebnisse)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als regelmäßige Ausdruck-Motoren, die in aktuellen Browsern werden fuchsteufelswild in Bezug auf die Geschwindigkeit, wie es zu tun auf diese Weise? Anstatt ein array übergeben, eine gigantische string und trennen Sie die Wörter mit einem Bezeichner.
Beispiel:
"flipping burgers""pumping gas""delivering mail"
"([^"]*ping[^"]*)"
Mit dem Schalter
/g
für global erhalten Sie alle Spiele. Stellen Sie sicher, dass der Benutzer nicht nach Ihrem string separator.Können Sie auch hinzufügen, eine id in den string mit etwas wie:
"11 flipping burgers""12 pumping gas""13 delivering mail"
Regex:
"(\d+) ([^"]*ping[^"]*)"
Beispiel: http://jsfiddle.net/RnabN/4/ (30000 strings, die Ergebnisse einzuschränken-100)
Es gibt keinen Weg, um die Geschwindigkeit einer ersten array-lookup, ohne einige änderungen. Sie können die Geschwindigkeit consequtive-lookups durch Zwischenspeicherung von Ergebnissen und zuordnen, Muster dynamisch.
1.) Passen Sie Ihre Daten-format. Dieses macht ersten lookups etwas schneller. Im Grunde, Sie precache.
2.) Setup-cache-mechanik.
3.) Das folgende Skript verwenden, erstellen Sie ein precache-Objekt. Ich schlage vor, Sie diese einmal und verwenden Sie JSON.stringify zum erstellen einer statischen cache-Objekt. (oder tun Sie dies über das backend)
Wahrscheinlich ein bisschen mehr code, dann Sie erwartet, aber optimalisation und Leistung nicht zum Nulltarif.
Dies ist vielleicht nicht eine Antwort für Sie, wie mache ich einige Annahmen über Ihre Einrichtung, aber wenn Sie server-side-code und eine Datenbank, Sie wären weit besser dran, ein AJAX-call zurück, um die cut-down-Liste die Ergebnisse und die Verwendung einer Datenbank, um die Filterung (da sind Sie sehr gut auf diese Art der Sache).
Sowie der Datenbank profitieren, möchten Sie profitieren auch nicht ausgeben, so viel Daten (10000 Variablen), um eine web-basierte front-end -, wenn Sie nur zurück, diejenigen, die Sie benötigen, dann sparen Sie ein gutes Stück der Bandbreite.
Ich kann das problem nicht reproduzieren, habe ich mir eine naive Implementierung, und die meisten Browser führen Sie die Suche über 10000 15 char-strings in einer einstelligen Anzahl von Millisekunden. Ich kann das nicht testen im IE6, aber ich würde nicht glauben, dass es mehr als 100 mal langsamer als der Schnellste Browser, der noch nahezu instant.
Versuchen Sie es selbst: http://ebusiness.hopto.org/test/stacktest8.htm (Beachten Sie, dass der Zeitpunkt der Erstellung ist nicht relevant für das Problem, das ist nur da, um einige Daten zu arbeiten.)
Eines, was man falsch machen kann, ist versuchen, um die Darstellung aller Ergebnisse, das wäre eine ziemlich große Aufgabe ist, wenn der Nutzer hat nur trat ein einzelner Buchstabe oder eine gemeinsame Buchstaben-Kombination.
Ich schlage vor, versucht eine fertige JS Funktion, zum Beispiel die
autocomplete
von jQuery. Es ist schnell und es hat viele Optionen zu konfigurieren.Check-out die jQuery autocomplete demo