Iirc, Oracle एक 3-स्तरीय शब्दावली छँटाई लागू करता है (लेकिन एलेक्स पूल की सलाह पर ध्यान दें और पहले NLS सेटिंग्स की जाँच करें):
- आधार वर्णों के आधार पर प्रथम श्रेणीबद्ध करें केस और विशेषक को अनदेखा करते हुए, मिलान क्रम में अक्षरों के बाद अंक आते हैं।
- दूसरा, संबंधों पर विशेषक का सम्मान करते हुए, मामले को अनदेखा करना।
- तीसरा, संबंधों के आधार पर क्रमबद्ध करें।
10 सन्निहित कोड बिंदुओं की पहचान करके बाद वाले को संभालें जो अंकों का प्रतिनिधित्व नहीं करते हैं और जो कोड बिंदुओं के सेट से परे हैं जो आपके द्वारा सॉर्ट किए जा रहे स्ट्रिंग्स में हो सकते हैं। चुने हुए कोड बिंदु सीमा पर मानचित्र अंक क्रम को संरक्षित करते हुए। जब आप सॉर्ट करते हैं, तो यूनिकोड कोलेटिंग एक्सटेंशन 'डायरेक्ट' निर्दिष्ट करें जिसका अर्थ है 'कोड पॉइंट द्वारा सॉर्ट करना'। छँटाई के बाद रीमैप करें।
नीचे दिए गए 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
नीना स्कोल्ज़ की टिप्पणी के बाद सुव्यवस्थित।