Kann jemand bitte diese Regex-Filterung eines Arrays erklären

8

Ich filtere ein Array und finde hier eine Regex. Ich versuche das zu verstehen:

%Vor%

Aber ich verstehe nicht, wie das Array seinen Wert gegen die Regex testet oder warum Sie mit /./ beginnen müssen, anstatt nur die Regex zu schreiben. Und wie funktioniert Bind in diesem Fall?

EDIT: Key ist nur eine Zeichenfolge, die ich anpassen möchte, "Hallo" oder "Hund" oder "alles wirklich".

    
ptf 31.05.2013, 14:27
quelle

2 Antworten

14

Die .bind() -Methode gibt eine Funktion mit dem zurück, was Sie als erstes Argument als Wert für this übergeben haben.

Da Sie .bind() von .test() aufrufen, erhalten Sie die Methode .test() mit der this an new RegExp(key, 'g') gebunden.

Das /./ ist hier irrelevant. Es ist nur ein kurzer Weg zur Methode RegExp.prototype.test .

Das Ergebnis ist, dass Sie effektiv tun werden:

%Vor%

Sie sollten beachten, dass dies ein wenig gefährlich ist, da ein regex-Objekt mit dem% modifier g stateful ist. Dies bedeutet, dass immer eine neue Suche gestartet wird, wo die vorherige unterbrochen wurde.

Angesichts dieses Filterszenarios scheint g überhaupt nicht notwendig zu sein und könnte wirklich nur Probleme verursachen.

Hier ist ein Beispiel für die Gefahr der Verwendung von g hier:

%Vor%

Wenn also derselbe Regex für dieselbe Zeichenfolge aufgerufen wird, ergeben sich zwei verschiedene Ergebnisse. Wenn wir es erneut aufrufen, wäre es wieder true .

Wenn wir also den% code% callback verwenden, sagen wir .filter() ist key , dann sagen wir 1 "foo" ist val . Es wird durch den Filter erlaubt.

Aber sagen wir mal, das nächste "foobar" ist val . Die Suche wird mit dem vierten Zeichen fortgesetzt, anstatt mit dem ersten zu beginnen, so dass "foobaz" nicht gefunden wird.

Hier ist ein konkretes Beispiel, das das Problem in Aktion zeigt:

DEMO: Ссылка

%Vor%

Alle Strings haben "foo" , also sollten sie alle durchkommen. Aber das Ergebnis zeigt, dass das nicht passiert.

%Vor%     
Crazy Train 31.05.2013, 14:48
quelle
6

Ich denke, der Grund dafür ist, dass Sie die Testmethode für jedes Element im Array ausführen möchten. Wenn Sie nur die Testmethode zum Filtern übergeben, wird (vermutlich) die Bindung der Methode durcheinander gebracht.

Deshalb in Ihrem Beispiel:

%Vor%

Erzeugt eine leere Regex

%Vor%

ist die Testmethode für diese Regex

%Vor%

bindet diese Methode an die angeforderte Methode und gibt eine neue Methode zurück, die test ausführt, wobei this auf Basis von key Ihrer gelieferten Regex ist.

Es scheint, dass es viel klarer hätte geschrieben werden können:

%Vor%     
Kamiel Wanrooij 31.05.2013 14:34
quelle

Tags und Links