Iirc implementerer Oracle en 3-trins leksikografisk sortering (men følg rådene fra Alex Poole og tjek NLS-indstillingerne først):
- Først sorteres efter grundtegn uden at ignorere store og små bogstaver og diakritiske tegn, cifre kommer efter bogstaver i sorteringssekvensen.
- For det andet, på slips sortere med respekt for diakritiske tegn, ignorere store og små bogstaver.
- For det tredje, om slips sorteret efter sag.
Du kan efterligne adfærden ved hjælp af javascript locale apis a> ved at efterligne hvert trin på skift i en brugerdefineret sammenligningsfunktion, med undtagelse af bogstav-ciffer-inversionen i sorteringssekvensen.
Håndter sidstnævnte ved at identificere 10 sammenhængende kodepunkter, der ikke repræsenterer cifre, og som ligger ud over det sæt af kodepunkter, der kan forekomme i de strenge, du sorterer. Tilknyt cifre til det valgte kodepunktområdes bevaringsrækkefølge. Når du sorterer, skal du angive Unicode-samlingsudvidelsen 'direct', som betyder 'sortering efter kodepunkt'. Omstil efter sortering.
I PoC-koden nedenfor har jeg valgt nogle kyrilliske tegn.
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)); } ); } );
Rediger
Funktion cmptiered
strømlinet efter Nina Scholz' kommentar.