2014-09-16 23 views
22

Avendo alcuni lievi problemi nel cercare di ottenere underscore.js per eseguire l'ordinamento senza distinzione tra maiuscole e minuscole. Ho una matrice di oggetti e vorrei essere in grado di ordinare per nome della proprietà.Underscore.js Ordinamento senza distinzione tra maiuscole e minuscole

Usando metodo rapido sortBy

iteratee può anche essere il nome di stringa della proprietà per l'ordinamento (ad es. Lunghezza).

Array da ordinare:

var array = [{ name: 'test_1234', description: 'zzaaa bb cc'}, 
     { name: 'zz1111', description: 'ZAAbbbcc'}, 
     { name: 'TEST', description: '4422'}, 
     { name: '1a2929', description: 'abcdef'}, 
     { name: 'abc', description: 'Full description'}, 
     { name: 'GGGGH', description: '123456'}]; 

ordinamento utilizzando questo metodo, sortProperty = 'name', i luoghi di risultato maiuscolo prima minuscolo.

var sorted = _.sortBy(array, sortProperty); 

1a2929 - abcdef 
GGGGH - 123456 
TEST - 4422 
abc - Full description 
test_1234 - zzaaa bb cc 
zz1111 - ZAAbbbcc 

Presumo che ciò ha a che fare con la sensibilità caso, ma io non riesco a capire come cambiare i nomi nella matrice in caratteri minuscoli e confrontare in questo modo.

Qualsiasi aiuto è molto apprezzato.

Edit: Come sottolineato, si passa in nome o di una funzione, la funzione così appena regolato per tornare quale campo Ordina per: http://jsfiddle.net/rjaqp1vg/5/

risposta

59

Il nome per ordinare può essere il nome del campo o una funzione , quindi passa una funzione che fa una conversione in minuscolo.

var sorted = _.sortBy(array, function (i) { return i.name.toLowerCase(); }); 

dovrebbe fare il trucco.

+0

Ho pensato tanto, grazie. Devo solo includere quale proprietà ordinare, ad es. ritorna i.name.toLowerCase() o ritorna i.description.toLowerCase() –

12

Non utilizzare _.sortBy per questo. Il modo corretto di ordinare le stringhe in ordine alfabetico consiste nell'utilizzare localeCompare. Ecco un esempio in puro Javascript:

['Z', 'A','z','á', 'V'].sort(function(a, b){ 
    return a.localeCompare(b, undefined /* Ignore language */, { sensitivity: 'base' }) 
}); 

Vedere https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare.

+3

IE11 su https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare –

+1

Anche questo funziona bene , ma qual è il motivo per non utilizzare _sortBy per questo? – JulienD

+0

Perché sortBy non può usare 'localCompare', che è il modo corretto per confrontare le stringhe. Invece, usa gli operatori regolari '<', '>' per il confronto. –