我需要对数组进行排序。我想在alfa之后看到字符串的开头/包含数字。
为:
['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address']
应为:
['address', 'email', 'em0ail', 'ip', 'name', '0email', 1001, '23name']
所以0
应该在z
之后
columns.sort((a, b) => {
const x = a.toString();
const y = b.toString();
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
});
先返回数字
我应该如何处理这种情况?我必须遍历整个字符串吗?
答案 0 :(得分:3)
我必须遍历整个字符串吗?
如果只是将其作为字符串中的第一个字符(如您看来,em0ail
将根据字符串进行排序),则不会。只需检查字符串是以数字还是非数字开头,如果一个字符串有数字,而另一个没有数字,则返回适当的1或-1即可将非数字放在第一位。如果它们都以数字开头或不以数字开头,则返回localeCompare
的结果。
(对于一个数字,我们可以将其转换为字符串。)
const columns = ['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address'];
function startsWithDigit(v) {
const ch = v[0];
return ch >= "0" && ch <= "9";
}
columns.sort((a, b) => {
a = String(a);
b = String(b);
adigit = startsWithDigit(a);
bdigit = startsWithDigit(b);
if (adigit == bdigit) {
return a.localeCompare(b);
} else if (adigit) {
return 1;
} else {
return -1;
}
});
console.log(columns);
答案 1 :(得分:0)
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
var columns=['ip', 'email', '0email', 'em0ail' ,1001, '23name', 'name', 'address'];
function Turn(CharZ){
//Make 0~9 biger then a-z and A-Z
if(CharZ<'9'.charCodeAt()){
return CharZ+'Z'.charCodeAt();
}
return CharZ;
}
columns.sort((a, b) => {
var x = a.toString();
var y = b.toString();
var Lx=x.length;
var Ly=y.length;
var MinL=Math.min(Lx, Ly);
for (var i = 0; i < MinL; i++) {
if(Turn(x.charCodeAt(i))-Turn(y.charCodeAt(i))>0){
return 1;
}else if(Turn(x.charCodeAt(i))-Turn(y.charCodeAt(i))<0){
return -1;
}
}
//if front all equals but length not same mean there is remain
if (Lx > Ly) {
return 1;
}
if (Lx < Ly) {
return -1;
}
return 0;
});
document.body.innerHTML = columns;
</script>
</body>
</html>
希望获得帮助