jQuery grep пропускает термины в массиве

#javascript #jquery #arrays #regex

#javascript #jquery #массивы #регулярное выражение

Вопрос:

Я пытаюсь отфильтровать массив строк с помощью функции jQuery grep, но она пропускает элементы в массиве. Если я выполняю отладку через код, все условия возвращают true, но если я запускаю код без отладки, он пропускает второй элемент.

 <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery.grep demo</title>
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>
<p></p>
<script>
var arr = [ { value : "A1-99-101"}, { value : "A1-99-102"}, { value : "A1-99-109" } ];
var regex = /(?=.*?bA1.*b).*/ig;
var newarr = jQuery.grep(arr, function( n, i ) {
return (regex.test(n.value));
});
var printarr = '';
for (var i = 0; i < newarr.length;   i) {
  printarr  = newarr[i].value   ',';
}
$( "p" ).text( printarr );
</script>
</body>
</html>
  

Ответ №1:

У вас возникла проблема из-за g изменения в вашем регулярном выражении ( .../ig ). Это заставляет регулярное выражение продолжать с последней совпадающей позиции. Вот что происходит:

  • регулярное выражение соответствует A1-99-101 и сохраняет позицию в 0
  • на следующей итерации он перемещает позицию на 1, но не соответствует A1-99-102
  • затем регулярное выражение сбрасывает себя, потому что оно достигло конца строки
  • и, наконец, он соответствует третьему элементу A1-99-109

Чтобы исправить это, просто удалите g модификатор:

 var regex = /(?=.*?bA1.*b).*/i;
  

Также здесь есть ссылка на работу с рабочим кодом.

Редактировать

Также ваше регулярное выражение выглядит слишком сложным для меня. Если вы просто хотите фильтровать строки, начинающиеся с A1 , используйте следующее регулярное выражение:

 var regex = /A1/i;
  

Комментарии:

1. Большое вам спасибо, Иван! И причина, по которой я использую это регулярное выражение, заключается в том, что я хочу найти всю строку, где ‘A1’ появляется в любом месте строки.

2. Если вы хотите A1 сопоставить в любом месте, тогда /A1/i он выполнит эту работу.