我在 JavaScript 中有一个字符串数组:
var nick = ["~xxx", "@blue", "&demo", "+voice", "%yyy",
"nick1", "Nick2", "webmaster"];
我想对这些字符串进行排序,所以结果是这样的:
~xxx &demo @blue %yyy +voice nick1 Nick2 webmaster
我该怎么做?
我在 JavaScript 中有一个字符串数组:
var nick = ["~xxx", "@blue", "&demo", "+voice", "%yyy",
"nick1", "Nick2", "webmaster"];
我想对这些字符串进行排序,所以结果是这样的:
~xxx &demo @blue %yyy +voice nick1 Nick2 webmaster
我该怎么做?
乍一看,这有点棘手。但这是一种方法,假设列出的特殊字符是您唯一关心的字符:
var separator = '\uFFFF';
var prefixes = {
'~': '1',
'&': '2',
'@': '3',
'%': '4',
'+': '5'
};
function specialsort( array ) {
var prefixed = array.map( function( value ) {
var prefix = prefixes[ value.charAt(0) ] || '9';
return prefix +
value.toLowerCase() +
separator + value;
});
prefixed.sort();
return prefixed.map( function( value ) {
return value.split(separator)[1];
});
}
var nicks = [ "~xxx", "@blue", "&demo", "+voice", "%yyy", "nick1", "Nick2", "webmaster" ];
var sorted = specialsort( nicks );
console.log( sorted );
该代码通过创建一个具有如下格式的字符串的新数组来工作:
\uFFFF
) 的 Unicode 字符作为分隔符。然后可以直接对这些字符串的数组进行排序,并通过拆分该分隔符上的字符串并使用分隔符后面的部分(原始字符串)将结果转换为新数组。
或者,使用排序回调函数的稍微简单的方法:
var prefixes = {
'~': '1',
'&': '2',
'@': '3',
'%': '4',
'+': '5'
};
function specialsort( array ) {
return array.sort( function( a, b ) {
a = ( prefixes[ a.charAt(0) ] || '9' ) + a.toLowerCase();
b = ( prefixes[ b.charAt(0) ] || '9' ) + b.toLowerCase();
return a < b ? -1 : a > b ? 1 : 0;
});
}
var nicks = [ "~xxx", "@blue", "&demo", "+voice", "%yyy", "nick1", "Nick2", "webmaster" ];
var sorted = specialsort( nicks );
console.log( sorted );
对于冗长的数组,我倾向于采用第一种方法——创建一个修改后的数组并对其进行排序——因为它比使用排序回调更快。但是排序回调稍微简单一些,对于这种大小的数组来说并没有什么问题。
与修改后的数组相比,排序回调方法确实有另一个优势:它不依赖于那个稍微有点怪异的分隔符。
无论哪种方式,输出都是:
["~xxx", "&demo", "@blue", "%yyy", "+voice", "nick1", "Nick2", "webmaster"]
You can use regular expression and localeCompare() function, for case insensitive comparation add two lowercases:
var nick = ["~xxx", "@blue", "&demo", "+voice", "%yyy", "nick1", "Nick2", "webmaster"];
nick.sort(function(a,b){
return a.toLowerCase().replace(/[^\w\s]/gi, '').localeCompare(b.toLowerCase().replace(/[^\w\s]/gi, ''));
});
console.log(nick); // ["@blue", "&demo", "nick1", "Nick2", "+voice", "webmaster", "~xxx", "%yyy"]