Iirc, Oracle implementuje 3-úrovňové lexikografické třídění (ale dbejte rad Alexe Poolea a nejprve zkontrolujte nastavení NLS):
- Nejprve seřaďte podle základních znaků bez ohledu na velká a malá písmena a diakritiku, číslice následují za písmeny v posloupnosti řazení.
- Zadruhé, na kravatách se třídí s ohledem na diakritiku, ignoruje velká a malá písmena.
- Za třetí, na kravatách třídění podle případu.
Toto chování můžete emulovat pomocí javascript locale apis napodobováním každého kroku postupně ve vlastní porovnávací funkci, s výjimkou inverze písmen a číslic v porovnávací sekvenci.
Vyřešte to tím, že identifikujete 10 souvislých kódových bodů, které nepředstavují číslice a které leží za sadou kódových bodů, které se mohou vyskytovat v řetězcích, které třídíte. Mapujte číslice do zvoleného rozsahu kódových bodů se zachováním pořadí. Při řazení zadejte příponu řazení Unicode „přímé“, což znamená „řazení podle bodu kódu“. Po seřazení přemapujte.
V níže uvedeném kódu PoC jsem vybral některé znaky cyrilice.
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)); } ); } );
Upravit
Funkce cmptiered
zjednodušené po komentáři Niny Scholzové.