У мене дуже важка проблема:
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);
}
});
Це повинно надрукувати мені обидва елементи з "кішки". Але я отримую лише перше. Якщо я додаю більше предметів, я отримую лише кожен 2-й (починати з першого).
Я розмовляю з цим:
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);
}
});
Але я не розумію, чому це не працює (Chrome) - хтось ідею?
Відповіді:
6 за відповідь № 1Це через те, що g
("глобальний") прапор. Екземпляри RegExp мають стан, коли ви використовуєте g
прапор:Вони пам’ятають, де був останній збіг, який бачили, тому можуть продовжувати з цього моменту (наприклад, якщо ви використовуєте їх у циклі). (Так, це не найкращий дизайн, який він міг мати.) Отже перший час, це знаходить test
у рядку (і зазначає, що це не в кінець рядка); вдруге вона намагається знайти test
продовжуючи в попередньому рядку з попереднього місця, і, звичайно, не знаходить. Третій раз, оскільки він знає, що минулого разу у нього закінчилось введення, він знову переглядає введення.
У вашому випадку, оскільки вам не потрібно шукати далі, ніж перша інстанція, просто видаліть g
прапор:
var searchreg = /test/; // That"s a regex literal, basically: ... = new RegEx("test")
Крім того, ви можете скинути його, призначивши 0
до його lastIndex
майно:
searchreg.lastIndex = 0;
if (searchreg.test(item.slug))
Або в цьому конкретний у випадку використання, вам взагалі не потрібен регулярний вираз:
if (item.slug.indexOf("test") !== -1) {
// It has "test" in the slug
}