2015-01-09 7 views
6

ho una pagina web in cui se qualcosa digitato nella casella di ricerca poi itera attraverso un file per quel valore, ne ho bisogno in modo che ricerca/trova non distinzione tra maiuscole e minuscole . La distinzione tra maiuscole e minuscole deve rimanere nel file ma a fini di confronto non tiene conto del caso. così Attualmente sto usando comando sottolineatura:come usare _.where() nel carattere di sottolineatura per confrontare i valori indipendentemente dal caso

arr=_.where(arr,filter); 

ma le 2 matrici arr e filter - ho bisogno per essere confrontato/usato indipendentemente caso quindi l'arr risultato finale contiene quale verranno miscela di cassa superiore e inferiore ma corrisponde valore (s) in arr. qualcuno può aiutare per favore?

+1

Perché non convertire allo stesso caso nella funzione di filtro? –

risposta

1

Purtroppo, JS non è grande quando si tratta di internazionalizzato confronto di stringhe maiuscole e minuscole. Se sei solo attenersi ad ASCII, però, la soluzione è abbastanza semplice (utilizzando filter però, non where):

function getMatches(query, arr) { 
    var lowerQuery = query.toLowerCase(); 
    return _.filter(arr, function(term) { 
    return term.toLowerCase() == lowerQuery; 
    }); 
} 

Oppure, se si vuole precompute tutto perché ci si aspetta di fare un sacco di domande nella stessa sessione JS:

var index = _.groupBy(arr, function(term) { return term.toLowerCase(); }); 

// Post-process index to reduce memory footprint by turning redundant values to nulls 
// (which take up less memory than arrays with a string in them). 
index = _.object(_.map(index, function(terms, key) { 
    return [key, (terms.length == 1 && terms[0].toLowerCase() == terms[0] ? null : terms)]; 
})); 

function getMatches(query) { 
    var lowerQuery = query.toLowerCase(); 
    return (lowerQuery in index ? index[lowerQuery] || lowerQuery : []); 
} 

Questo secondo metodo ha il vantaggio di soli calcolo toLowercase() il numero minimo di volte, e la memorizzazione minima a causa della fase di post-elaborazione.

Here's a JSFiddle for both

2

Provare a utilizzare filter invece:

var filter = ["Apple", "bANAna", "orange"]; 
 
var arr = ["apPle", "ORANGE"]; 
 

 
// make filter lower case once  
 
var filterLower = _.invoke(filter, "toLowerCase"); 
 

 
var arr2 = _.filter(arr, function(v) { 
 
    // make entry lower case and see if it is in filterLower 
 
    return _.contains(filterLower, v.toLowerCase()); 
 
}); 
 

 
console.dir(arr2);
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>

+0

Sebbene possibilmente più performante se stai eseguendo molte query (nella misura in cui ci sono solo chiamate 'n + q'' toLowerCase' piuttosto che 'n * q' con la mia soluzione, dove' n' è il numero di termini e 'q' è il numero di query), si dovrebbe notare che questa soluzione richiede il doppio della memoria, il che può essere problematico se la lista dei termini è lunga. Inoltre, Rhumborl, leggera modifica ma penso che OP stia cercando solo di cercare una query alla volta. Penso che abbiano misspoke chiamando 'filter' un array. – 0x24a537r9

+0

Inoltre, penso che questo sarebbe più performante (tempi di ricerca costanti) usando un 'oggetto' con i termini minuscoli come le chiavi che puntano agli array delle stringhe originali a cui fanno riferimento. Potresti anche ottimizzare i requisiti di spazio sostituendo gli array di valori per parole singole, già minuscole, un tipo più compatto come 'true' e solo sapere come interpretarlo. – 0x24a537r9

Problemi correlati