Как искать массив в Jquery как SQL LIKE% value% - PullRequest
22 голосов
/ 16 марта 2011

У меня есть массив с некоторыми значениями.Как я могу найти в этом массиве с помощью jquery значение, которое соответствует или близко к нему?

var a = ["foo","fool","cool","god"];

Если я хочу найти oo, то он должен вернуть foo, foolи cool, потому что эти строки содержат oo.

Ответы [ 7 ]

36 голосов
/ 16 марта 2011

Обновлено

Для поиска в массиве с помощью Vanilla js я бы использовал метод filter(), реализованный в прототипе Array

Стиль хакера

let a = ["foo","fool","cool","god"];
let b = a.filter(item => item.indexOf('oo') > -1);
console.log(b); // ["foo","fool","cool"]

Стиль ES6 (ES2015)

const fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

const filterItems = (needle, heystack) => {
  let query = needle.toLowerCase();
  return heystack.filter(item => item.toLowerCase().indexOf(query) >= 0);
}

console.log(filterItems('ap', fruits)); // ['apple', 'grapes']
console.log(filterItems('ang', fruits)); // ['mango', 'orange']

ES5 стиль

var fruits = ['apple', 'banana', 'grapes', 'mango', 'orange'];

function filterItems(needle, heystack) {
  var query = needle.toLowerCase();
  return heystack.filter(function(item) {
      return item.toLowerCase().indexOf(query) >= 0;
  })
}

console.log(filterItems('ap', fruits)); // ['apple', 'grapes']
console.log(filterItems('ang', fruits)); // ['mango', 'orange']

Примечание: для очень больших массивов вы можете рассмотреть возможность их рефакторинга для асинхронных / ожидающих функций


Это устаревший ответ

Для поиска в массиве с помощью jQuery вы можете использовать jQuery.grep() или jQuery.map(). Оба возвращают новый массив с отфильтрованными элементами, используя функция обратного вызова.

Самая быстрая реализация (без учета регистра) использует indexOf и toUpperCase в обратном вызове:

var search_term = 'oo'; // your search term as string
var search = search_term.toUpperCase();
var array = jQuery.grep(a, function(value) {
    return value.toUpperCase().indexOf(search) >= 0;
});

Если вам не нужен поиск без учета регистра, вы можете удалить оба параметра .toUpperCase(), чтобы ускорить его.

Более гибким, но гораздо более медленным (достаточно хорошим для небольших массивов) является использование регулярное выражение:

var search_term = "oo"; // search term
var search = new RegExp(search_term , "i");
var arr = jQuery.grep(a, function (value) {
    return search.test(value);
});

или

var search_term = "oo"; // search term
var search = new RegExp(search_term , "i");
var arr = jQuery.map(a, function (value) {
    return value.match(search) ? value : null;
});

Регулярные выражения позволяют сделать поиск гораздо более сложным, чем %value%. Однако не используйте его, если он вам не нужен, потому что это во много раз медленнее.

вы должны получить массив arr с соответствующими элементами

3 голосов
/ 16 марта 2011
function find(arr) {
    var result = [];

    for (var i in arr) {
        if (arr[i].match(/oo/)) {
            result.push(arr[i]);
        }
    }

    return result;
}

window.onload = function() {
    console.log(find(['foo', 'fool', 'cool', 'god']));
};

печатает ["foo", "fool", "cool"]

2 голосов
/ 16 марта 2011

Попробуйте следующий код js

function likeMatch(q)
{
    my_arr = ["foo","fool","cool","god"];
    var rArr=[];

    for(var t in my_arr)
    {
      if(my_arr[t].indexOf(q)>0)   
      rArr.push(my_arr[t]);
    }
  return(rArr);
}
1 голос
/ 29 августа 2014

попробуйте это:

var infoData = ["foo","fool","cool","god"], 
search   = 'oo';

//this makes the magic
infoData = $$(infoData).filter(function(){
        return (this.search(search) >= 0)
    })  

var n = infoData.length;
    console.log("size result: "+ n );

for(var item = 0; item < n ;item++){
    console.log("item: "+item+" data : "+infoData[item]);       
}

результат:

size result: 3

item: 0 data : foo
item: 1 data : fool
item: 2 data : cool 
0 голосов
/ 18 сентября 2017

используйте следующую функцию, если вы ищете в массиве, содержащем объект хэши

 function searchInArrayofHashes(array,key,keyword) {
  responsearr = []
  for(i=0;i<array.length;i++) {
      if(array[i][key].indexOf(keyword) > -1 ) {
        responsearr.push(array[i])
    }
  }
  return responsearr
}
0 голосов
/ 21 декабря 2014

Вы можете сделать это с помощью Alasql JavaScript библиотеки SQL. Он поддерживает оператор LIKE, как в SQL

var a = ["foo","fool","cool","god"];
var searchString = "%oo%";

var res = alasql('SELECT COLUMN * FROM [?] WHERE [0] LIKE ?',[a, searchString]);

Попробуйте этот пример в jfFiddle.

0 голосов
/ 16 марта 2011

try $.inArray http://api.jquery.com/jQuery.inArray/. Я не уверен, что это позволит вам использовать регулярные выражения, но стоит попробовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...