@magary4

Регулярное выражение для поиска подстроки в массиве?

прикрутил typeahead
мэтчер такой

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);
  };
};

взятый отсюда https://twitter.github.io/typeahead.js/examples/

но и получается ровно так же как и в примере 443b9f5a86cc4e23990c622b0f39373e.png

надо чтоб Baltimore Ravens было выше чем остальные так как введенная подстрока "Ba" найдена в начале строки а не в середине
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вариант 1:
var mask = q.toLowerCase();
var matches = 
  strs.filter(function(str) { 
    return str.toLowerCase().includes(mask); 
  }).sort(function(str1, str2) { 
    return str1.toLowerCase().indexOf(mask) - str2.toLowerCase().indexOf(mask); 
  });

Вариант 2:
var re = new RegExp(q, 'i');
var matches = 
  strs.filter(function(str) { 
    return str.match(re); 
  }).sort(function(str1, str2) { 
    return str1.search(re) - str2.search(re); 
  });

Минус варианта с регуляркой - можно ввести символы, при которых произойдёт ошибка, например 'ba['.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Arik
Несколько раз обойти, но зато поиск по регулярке реже
var substringMatcher = function (strs) {
    return function findMatches(q, cb) {
        var matches, substrRegex;
        substrRegex = new RegExp(q, 'i');
        matches = strs.map(function (str) {
            return {pos: str.search(substrRegex), str: str};
        }).filter(function (a) {
            return a.pos > 0;
        }).sort(function (a, b) {
            return a.pos > b.pos;
        }).map(function (a) {
            return a.str;
        });

        cb(matches);
    };
};
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы