javascript - Javascript - 对包含重音的字符串数组进行排序

问题如下,我们有一个字符串数组,如下所示:


['único', 'UNICO', 'árbol', 'ARBOL', 'cosas', 'COSAS', 'fútbol', 'FUTBOL']



我们想要这样的东西(大写优先):


['ARBOL', 'COSAS', 'FUTBOL', 'UNICO', 'árbol', 'cosas', 'fútbol', 'único']



或者像这个(小写优先):


['árbol', 'cosas', 'fútbol', 'único', 'ARBOL', 'COSAS', 'FUTBOL', 'UNICO']



问题是:它很容易得到这个:


['ARBOL', 'COSAS', 'FUTBOL', 'UNICO', 'cosas', 'fútbol', 'árbol','único']



使用.sort();函数,我们使用,


.sort(function(a, b) {


 return a.localCompare(b);


});



但我们最终会用这个。


['ARBOL', 'árbol', 'COSAS', 'cosas', 'FUTBOL', 'fútbol', 'UNICO', 'único']



如何把两者结合起来?

时间:

在字符串开头,你可以简单地扩展排序函数以区分大写字符:


const arr = ['ÁRBOL', 'único', 'UNICO', 'árbol', 'ARBOL', 'cosas', 'COSAS', 'fútbol', 'FUTBOL'];



function startsWithUppercase(str) {


 return str.substr(0, 1).match(/[A-Zu00C0-u00DC]/);


}



arr.sort(function(a, b) {


 if (startsWithUppercase(a) && !startsWithUppercase(b)) {


 return -1;


 } else if (startsWithUppercase(b) && !startsWithUppercase(a)) {


 return 1;


 }


 return a.localeCompare(b);


});



console.log(arr);

你可以把它们分开,整理好,再放回一起。


let foo = ['único', 'UNICO', 'árbol', 'ARBOL', 'cosas', 'COSAS', 'fútbol', 'FUTBOL'];


foo = foo.reduce((a, b) => {


 b.toUpperCase() === b ? a[0].push(b) : a[1].push(b);


 return a;


}, [[],[]]).flatMap(e => e.sort((a, b) => a.localeCompare(b)));



console.log(foo);

你可以使用map进行排序并将每个字符替换为两个字符,具体取决于字符前面或后面有一个空格的大小写,然后对新数组进行排序和映射。

例子

未排序


index value


----- --------------------


 0 'ú n i c o '


 1 ' U N I C O'


 2 'á r b o l '


 3 ' A R B O L'


 4 ' c o s a s '


 5 ' C O S A S'


 6 ' f ú t b o l '


 7 ' F U T B O L'



排序


index value


----- --------------------


 3 ' A R B O L'


 5 ' C O S A S'


 7 ' F U T B O L'


 1 ' U N I C O'


 4 ' c o s a s '


 6 ' f ú t b o l '


 2 'á r b o l '


 0 'ú n i c o '




var array = ['único', 'UNICO', 'árbol', 'ARBOL', 'cosas', 'COSAS', 'fútbol', 'FUTBOL'],


 result = array


 .map((s, index) => ({ index, value: Array.from(s, c => c === c.toUpperCase()


 ? ' ' + c


 : c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'


 ? ' ' + c + ' '


 : c + ' '


 ).join('') }))


 .sort((a, b) => a.value.localeCompare(b.value))


 .map(({ index }) => array[index]);



console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...