Iirc, Oracle implementerar en lexikografisk sortering i tre nivåer (men följ råden från Alex Poole och kontrollera NLS-inställningarna först):
- Sortera först efter bastecken och ignorera skiftläge och diakritiska tecken, siffror kommer efter bokstäver i sorteringssekvensen.
- För det andra, på slipsar som respekterar diakritiska tecken, ignorerar skiftläge.
- Tredje, på slipsar sortera efter fall.
Du kan emulera beteendet med javascript locale apis a> genom att efterlikna varje steg i tur och ordning i en anpassad jämförelsefunktion, med undantag för inverteringen av bokstavssiffror i sorteringssekvensen.
Ta itu med det senare genom att identifiera 10 sammanhängande kodpunkter som inte representerar siffror och som ligger utanför den uppsättning kodpunkter som kan förekomma i strängarna du sorterar. Mappa siffror till den valda kodpunktsintervallets bevarande ordning. När du sorterar, ange Unicodes sammanställningstillägg "direkt", vilket betyder "sortering efter kodpunkt". Mappa om efter sortering.
I PoC-koden nedan har jag valt några kyrilliska tecken.
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)); } ); } );
Redigera
Funktion cmptiered
strömlinjeformad efter Nina Scholz kommentar.