Ho un problema molto strage:
var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];
var searchreg = new RegExp("test","g");
cat.forEach(function(item){
if(searchreg.test(item.slug)){
console.log(item);
}
});
Questo dovrebbe stamparmi entrambi gli elementi da "gatto". Ma ho solo il primo Se aggiungo più elementi, ottengo solo il 2 ° (inizio con il primo).
Lo capisco con:
var cat = [ { slug: "test/foo", id: 1}, { slug: "test/bar", id: 1}];
cat.forEach(function(item){
var searchreg = new RegExp("test","g");
if(searchreg.test(item.slug)){
console.log(item);
}
});
Ma non capisco perché questo non funzioni (Chrome) - qualcuno un'idea?
risposte:
6 per risposta № 1È a causa del g
("globale") flag. Le istanze RegExp hanno lo stato quando si utilizza il g
bandiera: Ricordano dove era l'ultima partita che hanno visto, quindi possono continuare da quel punto (ad esempio, se li stai usando in un ciclo). (Sì, questo non è il miglior design che avrebbe potuto avere.) Quindi il primo tempo, trova test
nella stringa (e osserva che non è al fine della stringa); la seconda volta, cerca di trovare test
continua nella stringa precedente dalla posizione precedente e, naturalmente, non la trova. La terza volta, dal momento che sa che è esaurita l'ultima volta, guarda di nuovo l'input.
Nel tuo caso, dal momento che non devi cercare oltre la prima istanza, semplicemente rimuovi il g
bandiera:
var searchreg = /test/; // That"s a regex literal, basically: ... = new RegEx("test")
In alternativa, è possibile ripristinarlo assegnando 0
al suo lastIndex
proprietà:
searchreg.lastIndex = 0;
if (searchreg.test(item.slug))
O, in questo specifica use case, non hai bisogno di regex affatto:
if (item.slug.indexOf("test") !== -1) {
// It has "test" in the slug
}