2016-12-14 5 views
0

Я добавляю поиск типа head. Everithing работает, но я нашел одну проблему. У меня есть текст в моем json например «Привет, меня зовут Джейсон (Mckay) и ...»

когда я пытаюсь ввести некоторые слова из этой строки everithin это нормально, но когда я типа„(“или„)“Я есть исключение:
Typeahead Invalid regular expression:/(/:

Uncaught SyntaxError: Invalid regular expression: /(/: Unterminated group 

я был смотреть в машинописный «Основы» и имеют ту же ошибку:

https://twitter.github.io/typeahead.js/examples/#prefetch

То же самое, когда я буду пытаться ввести любые nubmers первый «1», «2» и т.д. ...

Вот мой умолчанию substringMatcher, где проблема:

var substringMatcher = function(strs) { 
     return function findMatches(q, cb) { 
     var matches, substringRegex; 

     // an array that will be populated with substring matches 
     matches = []; 

     // regex used to determine if a string contains the substring `q` 
     substrRegex = new RegExp(q, 'i'); 

     // iterate through the pool of strings and for any string that 
     // contains the substring 'q', add it to the 'matches' array 
     $.each(strs, function(i, str) { 
      if (substrRegex.test(str)) { 
      matches.push(str); 
      } 
     }); 
     cb(matches); 
     }; 
    }; 
+0

' ('и многие другие символы имеют« специальное »значение в RegExp - см. [документация] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Special_characters_meaning_in_regular_expressions) –

+0

Я знаю, так что любое предложение, как решить это? – jason

+0

, если вы знаете о специальных символах в выражениях RegExp, то вы знаете, что специальный символ \ делает –

ответ

1

Использование регулярных выражений будет болезненным из всех «особых» символов, как ([и т.д.

ваш код, кажется, достаточно просто не использовать RegExp в любом случае - IndexOf должен сделать трюк

var substringMatcher = function(strs) { 
    return function findMatches(q, cb) { 
     q = q.toLowerCase(); 
     var matches = strs.filter(function(str) { 
      return str.toLowerCase().indexOf(q) >= 0; 
     }); 
     cb(matches); 
    }; 
}; 

Да, ES2015 + имеет Строка # включает в себя метод, который имеет смысл использовать - но почему бы не использовать ВСЕ преимущества ES2015 +

const substringMatcher = strs => (q, cb) => { 
    q = q.toLowerCase(); 
    cb(strs.filter(str => str.toLowerCase().includes(q))); 
}; 

или менее эффективным (toLowerCase называется чаще, чем это необходимо, но код сексуальнее

const substringMatcher = strs => (q, cb) => cb(strs.filter(str => str.toLowerCase().includes(q.toLowerCase()))); 
+0

Спасибо за ваш ответ, но я пробовал использовать любую из них и иметь ошибку: (index): 540 Uncaught TypeError: strs.filter не является функцией – jason