2014-09-16 26 views
22

Po kilku drobnych problemach próbujących przekonwertować underscore.js do sortowania niewrażliwego na wielkość liter. Mam szereg obiektów i chciałbym móc sortować według nazwy właściwości.Underscore.js Case Insensitive Sorting

Stosując metodę skrótu sortBy

iteratee może być również nazwa ciąg właściwość sortowania przez (np. Długość).

Array być klasyfikowane:

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'}]; 

Sortowanie za pomocą tej metody, SortProperty = 'name', miejsca wynik wielkimi literami przed małymi literami.

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

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

Przypuszczam, że ma to związek z wrażliwością na sprawy, ale nie mogę dowiedzieć się, jak zmienić nazwy w tablicy na małe i porównać ten sposób.

Każda pomoc jest bardzo doceniana.

Edit: Jak podkreślił, przechodzą w nazwie lub funkcji, więc po prostu dostosowane funkcja zwraca które pole do Sortuj według: http://jsfiddle.net/rjaqp1vg/5/

Odpowiedz

59

nazwę, aby posortować według może być nazwa pola lub funkcji , więc przekaż funkcję, która wykonuje konwersję małymi literami.

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

powinien załatwić sprawę.

+0

Tak wymyśliłem, dzięki. Po prostu muszę podać, do której własności należy się posortować, np. return i.name.toLowerCase() lub zwróć i.description.toLowerCase() –

12

Nie używaj _.sortBy do tego. Poprawnym sposobem sortowania łańcuchów alfabetycznie jest użycie localeCompare. Oto przykład w czystym Javascript:

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

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

+3

IE11 w górę https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare –

+1

To działa również , ale dlaczego nie używać _sortBy do tego? – JulienD

+0

Ponieważ sortBy nie może używać 'localCompare', który jest prawidłowym sposobem porównywania ciągów. Zamiast tego używa zwykłych operatorów '<', '>' dla porównania. –