33

Title sums it up.

hakre
  • 193,403
  • 52
  • 435
  • 836
JD Isaacks
  • 56,088
  • 93
  • 276
  • 422

8 Answers8

30

In case anyone wanted a more integrated approach using :

(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
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
  • 2
    You 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
    Isn't it toLowerCase rather than toLower? – Sarfraz Aug 02 '10 at 19:15
  • Technically InArray() returns -1 if not found. – scott.korin Jul 10 '12 at 18:48
  • 1
    Wouldn'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
  • 5
    I 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

It looks like you may have to implement your own solution to this. Here is a good article on adding custom functions to jQuery. You will just need to write a custom function to loop and normalize the the data then compare.

Apurv
  • 3,723
  • 3
  • 30
  • 51
Skyler
  • 341
  • 2
  • 10
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