Iirc, Oracle прилага 3-степенно лексикографско сортиране (но вслушайте се в съвета на Alex Poole и първо проверете настройките на NLS):
- Първо сортиране по основни знаци, като се игнорират главни и големи букви и диакритични знаци, цифрите идват след буквите в последователността на сортиране.
- Второ, сортирайте връзките, зачитайки диакритичните знаци, като пренебрегвате главните и главните букви.
- Трето, при връзки сортиране по регистър.
Можете да емулирате поведението, като използвате javascript locale apis чрез имитиране на всяка стъпка на свой ред в персонализирана функция за сравняване, с изключение на буквено-цифровата инверсия в последователността на сортиране.
Справете се с последното, като идентифицирате 10 последователни кодови точки, които не представляват цифри и които се намират извън набора от кодови точки, които могат да се появят в низовете, които сортирате. Картирайте цифрите върху реда за запазване на диапазона на избраната кодова точка. Когато сортирате, укажете разширението за сортиране на Unicode „директно“, което означава „сортиране по кодова точка“. Повторно картографиране след сортиране.
В PoC кода по-долу съм избрал някои символи на кирилица.
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)); } ); } );
Редактиране
Функция cmptiered
рационализирано след коментара на Нина Шолц.