JS - jQuery inarray ignoreCase() and contains()
Solution 1
Part 1
You can process your array to be entirely lowercase, and lowercase your input so indexOf()
will work like it's performing a case insensitive search.
You can lowercase a string with toLowerCase()
as you've already figured out.
To do an array, you can use...
arr = arr.map(function(elem) { return elem.toLowerCase(); });
Part 2
You could check for a substring, for example...
// Assuming you've already transformed the input and array to lowercase.
var input = "word";
var words = ["word", "words", "wordly", "not"];
var found = words.some(function(elem) { return elem.indexOf(input) != -1; });
Alternatively, you could skip in this instance transforming the array to be all lowercase by calling toLowerCase()
on each elem
before you check indexOf()
.
some()
and map()
aren't supported in older IEs, but are trivial to polyfill. An example of a polyfill for each is available at the linked documentation.
As Fabrício Matté also pointed out, you can use the jQuery equivalents here, $.map()
for Array.prototype.map()
and $.grep()
with length
property for Array.prototype.some()
. Then you will get the browser compatibility for free.
Solution 2
To check if an array contains an element, case-insensitive, I used this code:
ret = $.grep( array, function (n,i) {
return ( n && n.toLowerCase().indexOf(elem.toLowerCase())!=-1 );
}) ;
Here is a fiddle to play with array match case insensitive
Comments
-
Obmerk Kronen almost 2 years
well, I am more of a PHP person, and my JS skills are close to none when it comes to any JS other than simple design related operations , so excuse me if I am asking the obvious .
the following operations would be a breeze in PHP (and might also be in JS - but I am fighting with unfamiliar syntax here ...)
It is some sort of input validation
var ar = ["BRS201103-0783-CT-S", "MAGIC WORD", "magic", "Words", "Magic-Word"]; jQuery(document).ready(function() { jQuery("form#searchreport").submit(function() { if (jQuery.inArray(jQuery("input:first").val(), ar) != -1){ jQuery("#contentresults").delay(800).show("slow"); return false; }
This question has 2 parts .
- 1 - how can I make it possible for the array to be case insensitive ?
E.g. -
BRS201103-0783-CT-S
will give the same result asbrs201103-0783-ct-s
ANDBrs201103-0783-CT-s
orMAGIC magic Magic MaGIc
basically i need something like ignoreCase() for array , but I could not find any reference to that in jQuery nor JS...
I tried
toLowerCase()
- but It is not working on the array (ittirating??) and also, would it resolve the mixed case ?- 2 - How can I make the function to recognize only parts or combinations of the elements ?
E.g. - if one types only
"word"
, I would like it to pass as"words"
, and also if someone types"some word"
it should pass (containing "word" ) -
Fabrício Matté almost 12 years
-
Obmerk Kronen almost 12 years@alex . Thanks . as much as your answer seems logic , the 1st part is not working for me somehow (maybe I am applying it wrong ??) - It returns true on lower but still false on upper .. I had put it like a new VAR
var arr = ar.map(function(elem) { return elem.toLowerCase(); });
and thenif (jQuery.inArray(jQuery("input:first").val(), arr) != -1)
(Note that my original array was called "ar" and not "arr" . is the culprit there ? -
user3167101 almost 12 yearsYou still need to call
toLowerCase()
on the input'svalue
, e.g.jQuery("input:first").val().toLowerCase()
. -
Obmerk Kronen almost 12 years.. stupid little me . I had it there from @Fabrício Matté reply, and then deleted . Thanks , all works just great . and more importantly - I have actually learned something :-) (to double check the code of masters before saying it is not working :-) )
-
Fabrício Matté almost 12 years
-
user3167101 almost 12 years@FabrícioMatté Good point, just be careful with jQuery's
map()
, it does things differently (like flattening returned arrays). -
Fabrício Matté almost 12 yearsIn that case, the
.map
may also be added to the array prototype if it's not natively supported, as shown in the MDN article.=]