2010-08-02 9 views

Antwort

23

können Sie each( verwenden) ...

// 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; 
    } 
}); 
+2

Sie wollen eine "Rückkehr false;" Am Ende dieser if-Anweisung wird also das "each" nicht fortgesetzt, nachdem ein übereinstimmendes Element gefunden wurde. (In jQuery.each() "return false;" entspricht "break;" in einer normalen JavaScript-Schleife.) –

+3

Ist es nicht zuLowerCase und nicht zuLower? – Sarfraz

+0

@ Jordan und @Sarfraz: beide gute Punkte –

1

Nein. Sie müssen mit Ihren Daten geizen, ich mache normalerweise alle meine Zeichenfolgen Kleinbuchstaben für einfache Vergleiche. Es besteht auch die Möglichkeit, eine benutzerdefinierte Vergleichsfunktion zu verwenden, die die erforderlichen Transformationen durchführt, um den Vergleich in Bezug auf die Groß- und Kleinschreibung unempfindlich zu machen.

1

könnte Schleife durch das Array und toLower jedes Element und toLower, was Sie suchen, aber zu diesem Zeitpunkt können Sie auch nur um es zu vergleichen, anstatt InArray der Verwendung()

1

Es sieht so aus, als müssten Sie möglicherweise Ihre eigene Lösung implementieren. Here ist ein guter Artikel zum Hinzufügen von benutzerdefinierten Funktionen zu jQuery. Sie müssen nur eine benutzerdefinierte Funktion schreiben, um die Daten zu loopen und zu normalisieren und dann zu vergleichen.

4

Vielen Dank an @Drew Wills.

Ich schrieb es als dies:

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; 
} 
+1

Das hat perfekt für mich funktioniert. – Alan

1

In diesen Tagen ziehe ich underscore für Aufgaben wie diese verwenden:

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 
24

Falls jemand einen stärker integrierten Ansatz wollte:

(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); 
+1

+1 Sehr nützlich, und sollte die ausgewählte Antwort sein. –

+0

Dies sollte zu der jQuery API hinzugefügt werden, Kopieren-Einfügen es jedes Mal wäre schwer, in Ordnung sowieso – Bor

+0

Das ist genial. Es braucht nur eine rechte geschweifte Klammer am Anfang der letzten Zeile. – EthR

Verwandte Themen