Что такое JavaScript-эквивалент предложения MySQL% LIKE%?

В MySQL я использую условие like:

LIKE %some keyword% 

выполнить поиск в записях базы данных. Что я могу использовать для аналогичного поиска в JavaScript? Поэтому, если пользователь вводит что-то вроде

ger

он отобразит

german shepard

Невозможно использовать:

str.search('ger');

поскольку он, кажется, соответствует целым словам

Ответ 1

он не точно такой же, как %LIKE%, но вы можете использовать indexOf().

var str = "Mohsen",
    st = "Moh";

if(str.indexOf(st) > -1) // true

Ответ 2

Я не уверен точно, в каком контексте вы используете подобный оператор (например, поле формы), но вы, вероятно, захотите использовать объект регулярного выражения javascript.

Простой пример (в вашем случае для запроса LIKE) может выглядеть так:

var regex = /.*ger.*/
var matchesRegex = regex.test(yourString);
if (matchesRegex) {
    //do something
}

В качестве альтернативы вы можете искать частоту вашей строки, используя операцию indexOf:

var matches = yourString.indexOf("ger") >= 0 ? true : false;
if (matches) {
    //do something
}

Ответ 3

Функция

search возвращает не только целые слова. Может быть, вы запутались в том, что он возвращает нулевой индекс, поэтому...

// this returns 0 as positive match at position 0
"german shepherd".search('ger')

// this returns -1 as negative match
"german shepherd".search('gerx')

Итак, вам нужно сравнить результат поиска с -1, чтобы увидеть, является ли это совпадением или нет - вы не можете просто проверить true/false.

Итак, вы могли бы сделать...

if(str.search('ger') !== -1){
    // matches string
} else {
    // does not match string
}

// or another way
// add one to convert result to one-based index, and check truthiness
if(str.search('ger')+1){
    // there is a match
} else {
    // there is not a match
}

Ответ 4

Я не уверен, поддерживают ли все браузеры все эти методы: http://www.javascriptkit.com/jsref/string.shtml

Но похоже, что существует метод String.match(), который будет делать то, что вы хотите.

Ответ 5

Предполагая, что у вас есть множество записей в виде массива строк, вы можете использовать встроенный Array.filter метод JavaScript:

var ss = ['german shepard', 'labrador', 'chihuahua'];
var matches = ss.filter(function(s) {
  return s.match(/ger/);
};
matches; // => ['german shepard']

Или, если ваш целевой JavaScript не реализует этот метод (например, он реализует ECMAScript до 5-го издания), вы можете выполнить простой поиск массива, например:

var searchArray = function(arr, regex) {
  var matches=[], i;
  for (i=0; i<arr.length; i++) {
    if (arr[i].match(regex)) matches.push(arr[i]);
  }
  return matches;
};
searchArray(ss, /h/); // => ['german shepard', 'chihuahua']

Ответ 6

Вот простой способ сделать это в JQuery.

Это использует фильтрацию текстовых данных внутри таблицы через фильтр данных в строке таблицы, но ее можно легко использовать для других целей.

$('#search').on('keyup', function() {
    var val = $.trim(this.value);
    if (val) {
        $('tr[data-filter!=' + val + ']').hide();
        $('tr[data-filter^=' + val + ']').show();
    } else {
       $('tr[data-filter]').show();
    }
});

В этом примере он будет скрывать все строки таблицы, где точное совпадение не найдено, а затем фильтровать по началу строкового значения. Функция trim() полезна в том случае, если все пустые пространства, то она все равно будет отображать все, как если бы поиск не был выполнен. Если вы хотите, чтобы он отображал искомый вход, где он находится в любом месте строки, используйте вместо *. Оба специальных символа чувствительны к регистру. Также убедитесь, что команда hide отображается сначала и что оба присутствуют, или она не будет работать должным образом.

См. другой пример, в котором используются как символы ^, так и *: http://jsfiddle.net/heatwaveo8/2VKae/