Iirc, Oracle wdraża 3-poziomowe sortowanie leksykograficzne (ale posłuchaj rady Alexa Poole'a i najpierw sprawdź ustawienia NLS):
- Najpierw sortuj według znaków podstawowych, ignorując wielkość liter i znaki diakrytyczne, cyfry występują po literach w kolejności sortowania.
- Po drugie, sortuj według znaków diakrytycznych, ignorując wielkość liter.
- Po trzecie, na krawatach sortuj według przypadku.
Możesz emulować zachowanie za pomocą javascript locale apis naśladując każdy krok po kolei w niestandardowej funkcji porównywania, z wyjątkiem inwersji literowo-cyfrowej w sekwencji sortowania.
Rozwiąż to ostatnie, identyfikując 10 ciągłych punktów kodowych, które nie reprezentują cyfr i które leżą poza zbiorem punktów kodowych, które mogą wystąpić w sortowanych ciągach. Mapuj cyfry na wybrany porządek zachowania zakresu punktów kodowych. Podczas sortowania określ rozszerzenie sortowania Unicode „bezpośrednie”, co oznacza „sortowanie według punktu kodowego”. Zmień mapę po sortowaniu.
W poniższym kodzie PoC wybrałem kilka znaków cyrylicy.
function cmptiered(a,b) {
//
// aka oracle sort
//
return lc_base.compare(a, b) || lc_accent.compare(a, b) || lc_case.compare(a, b);
} // cmptiered
var lc_accent = new Intl.Collator('de', { sensitivity: 'accent' });
var lc_base = new Intl.Collator('de-DE-u-co-direct', { sensitivity: 'base' });
var lc_case = new Intl.Collator('de', { caseFirst: 'lower', sensitivity: 'variant' });
var array = ['Ba12nes','Apfel','Banane','banane','abc','ABC','123','2', null, 'ba998ne' ];
// Map onto substitute code blocks
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[0-9]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "0".charCodeAt(0) + "\u0430".charCodeAt(0)); } ); } );
array.sort(cmptiered);
// Remap substitute code point
array = array.map ( function ( item ) { return (item === null) ? null : item.replace ( /[\u0430-\u0439]/g, function (c) { return String.fromCharCode(c.charCodeAt(0) - "\u0430".charCodeAt(0) + "0".charCodeAt(0)); } ); } );
Edytuj
Funkcja cmptiered
usprawniono po komentarzu Niny Scholz.