Title sums it up.
Asked
Active
Viewed 1.7k times
8 Answers
30
In case anyone wanted a more integrated approach using jquery:
(function($){
$.extend({
// Case insensative $.inArray (http://api.jquery.com/jquery.inarray/)
// $.inArrayIn(value, array [, fromIndex])
// value (type: String)
// The value to search for
// array (type: Array)
// An array through which to search.
// fromIndex (type: Number)
// The index of the array at which to begin the search.
// The default is 0, which will search the whole array.
inArrayIn: function(elem, arr, i){
// not looking for a string anyways, use default method
if (typeof elem !== 'string'){
return $.inArray.apply(this, arguments);
}
// confirm array is populated
if (arr){
var len = arr.length;
i = i ? (i < 0 ? Math.max(0, len + i) : i) : 0;
elem = elem.toLowerCase();
for (; i < len; i++){
if (i in arr && arr[i].toLowerCase() == elem){
return i;
}
}
}
// stick with inArray/indexOf and return -1 on no match
return -1;
}
});
})(jQuery);

Brad Christie
- 100,477
- 16
- 156
- 200
-
this should be added to the jQuery API, copy-pasting it every time would be hard, fine anyway – Bor Dec 13 '13 at 10:15
-
This is awesome. It just needs a right curly brace at the beginning of the last line. – EthR Dec 13 '13 at 14:46
-
Why the `$.extend({ inArrayIn: function ...` rather than just `$.inArrayIn = function ...`? – Luke Oct 09 '15 at 14:07
-
@Luke: No particular reason other than its one of the ways to do it. – Brad Christie Oct 09 '15 at 15:37
23
You can use each()...
// Iterate over an array of strings, select the first elements that
// equalsIgnoreCase the 'matchString' value
var matchString = "MATCHME".toLowerCase();
var rslt = null;
$.each(['foo', 'bar', 'matchme'], function(index, value) {
if (rslt == null && value.toLowerCase() === matchString) {
rslt = index;
return false;
}
});

Alnitak
- 334,560
- 70
- 407
- 495

Drew Wills
- 8,408
- 4
- 29
- 40
-
2You will want to add a "return false;" at the end of that if statement so the 'each' doesn't continue after a matching element is found. (In jQuery.each() "return false;" is equivalent to "break;" in a regular JavaScript loop.) – Jordan Running Aug 02 '10 at 19:15
-
3
-
-
1Wouldn't it be more efficient to store the `matchString.toLowerCase()` value in a variable before the loop instead of computing it for each iteration? – nbarraille Oct 04 '12 at 00:04
-
5I don't think `equals` is a native method in JavaScript? I think that should be `===`, right? – spinningarrow Oct 22 '12 at 11:17
4
Thank you to @Drew Wills.
I rewrote it as this:
function inArrayCaseInsensitive(needle, haystackArray){
//Iterates over an array of items to return the index of the first item that matches the provided val ('needle') in a case-insensitive way. Returns -1 if no match found.
var defaultResult = -1;
var result = defaultResult;
$.each(haystackArray, function(index, value) {
if (result == defaultResult && value.toLowerCase() == needle.toLowerCase()) {
result = index;
}
});
return result;
}

Ryan
- 22,332
- 31
- 176
- 357
1
These days I prefer to use underscore for tasks like this:
a = ["Foo","Foo","Bar","Foo"];
var caseInsensitiveStringInArray = function(arr, val) {
return _.contains(_.map(arr,function(v){
return v.toLowerCase();
}) , val.toLowerCase());
}
caseInsensitiveStringInArray(a, "BAR"); // true

JD Isaacks
- 56,088
- 93
- 276
- 422
1
No. You will have to fiddle with your data, I usually make all my strings lowercase for easy comparisons. There is also the possibility of using a custom comparison function which would do the necessary transforms to make the comparison case insensitive.

ase
- 13,231
- 4
- 34
- 46
1
could loop through the array and toLower each element and toLower what you're looking for, but at that point in time, you may as well just compare it instead of using inArray()

CrayonViolent
- 32,111
- 5
- 56
- 79
1
This way worked for me..
var sColumnName = "Some case sensitive Text"
if ($.inArray(sColumnName.toUpperCase(), getFixedDeTasksColumns().map((e) =>
e.toUpperCase())) == -1) {// do something}

developer_.net
- 196
- 3
- 14
-
1This works great for me, and I think it should be the accepted answer! – Jordan Gallagher Aug 31 '21 at 23:04