2012-11-26 17 views
15

Nehmen wir an, ich habe eine riesige (1000) Liste der Objekte wie folgt aus:Was ist der beste Weg, um eine Liste von JSON-Objekten in JavaScript zu filtern?

[{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

Ich möchte namentlich diese Liste filtern (Zeichen weise).

filter('j') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

filter('jo') => [{name: 'john dow', age: 38, gender:'m'}, ..] 

filter('dow') => [{name: 'john dow', age: 38, gender:'m'}, {name: 'jane dow', age: 18, gender:'f'}, ..] 

Was ist die höchste Leistung, dies zu tun? RegEx ist natürlich einer der Schlüssel, die Liste vorher zu ordnen, wenn man davon ausgeht, dass Benutzer in der Regel dazu neigen, Namen von Anfang an zu starten, mag auch eine gute Idee sein, hilft aber nur in einigen Fällen.

Gibt es JavaScript-integrierte Funktionen zum Zuordnen eines Filters? Ich würde erwarten, dass diese schneller als JavaScript-Implementierungen sind.

S.S .: Ja Ich möchte auf Client-Seite wegen "Offline-Funktionen" filtern, die ich anbieten möchte.

+3

Eigentlich, wenn sie Objekte in JavaScript sind, sind sie nicht mehr JSON. "JSON" ist * nur * die Notation, die verwendet wird, um diese Information über das Netzwerk zu übertragen (oder möglicherweise zu speichern). Innerhalb eines JavaScript-Programms sind sie einfach "JavaScript-Objekte" (es sei denn, Sie sprechen von einem String, der * die codierten JSON-Daten * enthält. In diesem Fall sollten Sie sie in JavaScript-Objekte konvertieren, bevor Sie damit weiterarbeiten). –

+0

Was ist, wenn Sie nach "ohn" suchen? –

+0

@JoachimSauer hast du recht ..Ich habe das behoben;) Filter ('ohn') => [{Name: 'John Dow', Alter: 38, Geschlecht: 'm'}, ..] – wzr1337

Antwort

10

Obwohl ein substring index (wie ein Suffix tree) würde dies schneller machen, würde die direkte Suche sein:

function (s, l) { 
    return l.filter(function (v) { 
     return v.name.find(s) !== -1; 
    }); 
} 

wo s ist der Query-String und l ist die Liste der Objekte.

+2

Eine gerade 'For'-Schleife ist mindestens doppelt so schnell wie ein nativer Filter. https://jsperf.com/array-filter-performance – Mrchief

+0

@Dan D. Sie erwähnen einen Teilzeichenindex. Kann man ein Beispiel geben? Ich habe eine ähnliche Anwendung mit Offline-Suchfunktion. 200.000 Objekte zu durchsuchen ist derzeit nicht schnell genug mit regulären '.filter()' – mesqueeb

9

Aus Erfahrung funktioniert der folgende Algorithmus recht gut:

  1. Wenn der Benutzer den ersten Buchstaben, Sie eine Suche mit Array.filter() vielleicht und zu speichern durchführen, die unter jeder Anwendertypen (zB „j“ führen);

  2. Wenn der Benutzer einen anderen Buchstaben (zB „o“), führen Sie die Suche auf, was vor („j“) eingegeben wurde, um die Anzahl der Elemente zu reduzieren durch

  3. Wenn der Benutzer Löschungen ein oder mehrere Zeichen versuchen Sie, die gespeicherten Suchen basierend auf dem zu finden, was im Suchfeld noch vorhanden ist; Wenn alles fehlschlägt, zeigen Sie eine leere Liste an und machen die zuvor gespeicherten Suchen ungültig.

+0

alle Bibliotheken/Code-Beispiele zu teilen, die dieses Muster implementieren? –

+0

Ich denke, das ist ein sehr guter Ansatz ... Kennen Sie eine Bibliothek bereit zu verwenden? –

4

Ich würde mir in diesem Fall nicht zu viel Gedanken über die Leistung machen. Ein Desktop-Computer sollte 1000 oder 10.000 Bewertungen ohne Schweiß essen. Ich würde jede Art von komplexer Optimierung vermeiden, da das Risiko, Funktionalität zu zerstören, wahrscheinlich höher ist als der Vorteil einer leicht effizienten Verarbeitung.

Javascript (ECMAScript 5) bietet neue Methoden zum Filtern von Arrays. Als native Methode soll es etwas schneller sein.

var regex = ... 

results = json.filter(function(result) { 
    return regex.test(result.name) 
} 

Array.prototype.filter in modernen Browsern unterstützt wird, finden http://kangax.github.com/es5-compat-table/. Ein Patch für ältere Browser kann hinzugefügt werden: https://github.com/kriskowal/es5-shim

Verwandte Themen