对字符串的JavaScript数组进行排序,并对第一个字符中的标点符号进行自定义排序
我有一个JavaScript字符串数组:对字符串的JavaScript数组进行排序,并对第一个字符中的标点符号进行自定义排序,javascript,sorting,Javascript,Sorting,我有一个JavaScript字符串数组: var nick=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”, “nick1”、“Nick2”、“网站管理员”]; 我想对这些字符串进行排序,使结果按以下顺序排列: ~xxx&demo@blue%yyy+voice nick1 Nick2网站管理员 如何执行此操作?您可以使用正则表达式和localeCompare()函数,对于不区分大小写的比较,请添加两个小写: var nick = ["~xxx", "@blue
var nick=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”,
“nick1”、“Nick2”、“网站管理员”];
我想对这些字符串进行排序,使结果按以下顺序排列:
~xxx&demo@blue%yyy+voice nick1 Nick2网站管理员
如何执行此操作?您可以使用正则表达式和localeCompare()函数,对于不区分大小写的比较,请添加两个小写:
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"]
乍一看,这有点棘手。但这里有一种方法,假设您只关心列出的特殊字符:
var分隔符='\uFFFF';
变量前缀={
'~': '1',
'&': '2',
'@': '3',
'%': '4',
'+': '5'
};
函数特殊排序(数组){
var前缀=array.map(函数(值){
var prefix=前缀[value.charAt(0)]| |“9”;
返回前缀+
value.toLowerCase()+
分隔符+值;
});
前缀为.sort();
返回带前缀的.map(函数(值){
返回值.拆分(分隔符)[1];
});
}
变量nicks=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”、“nick1”、“Nick2”、“网站管理员”];
var排序=特殊排序(nicks);
控制台日志(已排序);
代码的工作方式是创建一个新数组,其中字符串的格式如下:
\uFFFF
)作为分隔符var前缀={
'~': '1',
'&': '2',
'@': '3',
'%': '4',
'+': '5'
};
函数特殊排序(数组){
返回array.sort(函数(a,b){
a=(前缀[a.charAt(0)]| |“9')+a.toLowerCase();
b=(前缀[b.charAt(0)]| |“9')+b.toLowerCase();
返回ab-1:0;
});
}
变量nicks=[“~xxx”、“@blue”、“&demo”、“+voice”、“%yyy”、“nick1”、“Nick2”、“网站管理员”];
var排序=特殊排序(nicks);
控制台日志(已排序);
对于长数组,我倾向于使用第一种方法制作一个修改过的数组并对其进行排序,因为它比使用排序回调更快。但是排序回调稍微简单一点,对于这种大小的数组,它没有什么问题
与修改后的数组相比,排序回调方法还有另一个优点:它不依赖于稍微粗糙的分隔符
无论哪种方式,输出都是:
[“~xxx”、“&demo”、“@blue”、“%yyy”、“+voice”、“nick1”、“Nick2”、“网站管理员”]
这是a和a。你试过什么?请参见,您可以为Array.prototype.sort提供自己的排序功能。您的
控制台.log
输出是否与OP请求的顺序相同?此代码按字母顺序对数组排序,排序时只忽略前导的特殊字符。