2010-08-02 10 views

risposta

23

È possibile utilizzare 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; 
    } 
}); 
+2

Si vorrà aggiungere un "return false;" alla fine di tale istruzione if in modo che 'ciascuno' non continui dopo che viene trovato un elemento corrispondente. (In jQuery.each() "return false;" è equivalente a "break;" in un normale ciclo di JavaScript.) –

+3

Non è toLowerCase anziché aLower? – Sarfraz

+0

@Jordan e @Sarfraz: entrambi i punti positivi –

1

No. Dovrai armeggiare con i tuoi dati, di solito faccio tutte le mie stringhe in minuscolo per facili confronti. Esiste anche la possibilità di utilizzare una funzione di confronto personalizzata che effettuerebbe le trasformazioni necessarie per rendere insensibile la comparazione del caso.

1

potrebbe scorrere l'array e tolower ogni elemento e ToLower quello che stai cercando, ma a quel punto nel tempo, si può anche semplicemente confrontarlo invece di utilizzare inArray()

1

Sembra che potrebbe essere necessario implementare la propria soluzione a questo. Here è un buon articolo sull'aggiunta di funzioni personalizzate a jQuery. Dovrai semplicemente scrivere una funzione personalizzata per eseguire il ciclo e normalizzare i dati, quindi confrontare.

4

Grazie a @Drew Wills.

ho riscritto come questo:

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

Questo ha funzionato perfettamente per me. – Alan

1

In questi giorni io preferisco usare underscore per compiti come questo:

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

Nel caso qualcuno voleva un approccio più integrato con :

(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 Molto utile e dovrebbe essere la risposta selezionata. –

+0

questo dovrebbe essere aggiunto all'API jQuery, copiarlo ogni volta sarebbe difficile, comunque bene – Bor

+0

Questo è fantastico. Ha solo bisogno di una parentesi graffa destra all'inizio dell'ultima riga. – EthR

Problemi correlati