web-dev-qa-db-fra.com

Comment rechercher un tableau dans Jquery comme SQL LIKE% value% statement

J'ai un tableau avec des valeurs. Comment puis-je rechercher dans ce tableau en utilisant jQuery une valeur qui lui correspond ou qui est proche?

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

Si je veux rechercher oo, alors il devrait renvoyer foo, fool et cool car ces chaînes contiennent oo.

20
KillerFish

Mise à jour

Pour rechercher dans le tableau avec Vanilla js, je voudrais utiliser la méthode filter() implémentée dans le prototype Array

Style pirate

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

Style ES6 (ES2015)

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

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

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

Style 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']


Ceci est la réponse obsolète

Pour rechercher dans le tableau avec jQuery, vous pouvez utiliser jQuery.grep() ou jQuery.map(). Les deux renvoient un nouveau tableau avec des éléments filtrés à l'aide d'une fonction de rappel.

L'implémentation la plus rapide (insensible à la casse) utilise indexOf et toUpperCase dans le rappel:

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

Si vous n'avez pas besoin de recherche insensible à la casse, vous pouvez supprimer les deux fonctions .toUpperCase() pour l'accélérer davantage.

Plus souple mais beaucoup plus lent (suffisant pour les petits tableaux) consiste à utiliser une expression régulière:

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

ou

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

Les expressions régulières vous permettent d'effectuer des recherches beaucoup plus complexes que %value%. Cependant, ne l'utilisez pas si vous n'en avez pas besoin car il est plusieurs fois plus lent.

vous devriez obtenir un tableau arr avec les éléments correspondants

33
venimus
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']));
};

Il imprime ["foo", "fool", "cool"]

3
Rendicahya

Essayez le code js suivant

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);
}
2
Clyde Lobo

essaye ça:

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

résultat:

size result: 3

item: 0 data : foo
item: 1 data : fool
item: 2 data : cool 
1
user2311489

utilisez la fonction suivante si vous recherchez dans un tableau contenant un objet hash

 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
Apoorv

try $.inArrayhttp://api.jquery.com/jQuery.inArray/ . Je ne sais pas si cela vous permettra d'utiliser une expression régulière, mais ça vaut le coup d'essayer

0
Alistair Laing

Vous pouvez le faire avec Bibliothèque Alasql JavaScript SQL. Il supporte l'opérateur LIKE, comme en SQL

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

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

Essayez cet exemple à jfFiddle.

0
agershun