I have an array with some values. How can I search that array using jquery for a value which is matched or close to it?
var a = ["foo","fool","cool","god"];
If I want to search for oo
, then it should return foo
, fool
, and cool
because these strings contain oo
.
If you need to find the index of a value, use Array.prototype.indexOf() . (It's similar to findIndex() , but checks each element for equality with the value instead of using a testing function.) If you need to find if a value exists in an array, use Array.prototype.includes() .
Using find() The find() method returns the first value in an array that matches the conditions of a function. If there is no match, the method returns undefined .
1) Using jQuery If you are someone strongly committed to using the jQuery library, you can use the . inArray( ) method. If the function finds the value, it returns the index position of the value and -1 if it doesn't.
Use forEach() to find an element in an array The Array. prototype. forEach() method executes the same code for each element of an array. The code is simply a search of the index Rudolf (🦌) is in using indexOf.
To search in the array with Vanilla JS I would use the filter()
method implemented into the Array prototype.
Note: For very large arrays you might want to consider refactoring those to async/await functions else it might slow down the user interface.
This is the most flexible approach as you could search for different patterns. You should be aware that the search term here is not a plain text, thus you have to escape most of non-alphanumeric chars according to the syntax. You should not pass unprocessed user input directly to the function, as it will not work as expected.
let a = ["foo","fool","cool","god"]; var term = 'oo'; // search term (regex pattern) var search = new RegExp(term , 'i'); // prepare a regex object let b = a.filter(item => search.test(item)); console.log(b); // ["foo","fool","cool"]
indexOf
(faster)In this particular case I would rather use indexOf()
which is basically an equivalent of LIKE %term%
but much faster than using regular expressions when working with large arrays.
It is a common case to do case-insensitive searches so make sure to use toLowerCase()
for both the search terms and the array items. Otherwise remove it everywhere from the examples.
let a = ["foo","fool","cool","god"]; let term = 'oo'; let b = a.filter(item => item.toLowerCase().indexOf(term) > -1); console.log(b); // ["foo","fool","cool"]
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']
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']
This is the outdated answer
To search in the array with jQuery you might use
jQuery.grep()
orjQuery.map()
. Both return new array with filtered elements using a callback function.The fastest implementation (case insensitive) is using
indexOf
andtoUpperCase
in the callback: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; });
If you don't need case insensitive search you can remove both
.toUpperCase()
to speed it up even further.More flexible but much slower (good enough for small arrays) is to use regular expression:
var search_term = "oo"; // search term var search = new RegExp(search_term , "i"); var arr = jQuery.grep(a, function (value) { return search.test(value); });
or
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; });
Regular expressions allow you to make searches much more complex than
%value%
. However don't use it if you don't need it because it is many times slower.you should get an array
arr
with the matched elements
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'])); };
It prints ["foo", "fool", "cool"]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With