我有一个对象数组,其中每个对象都有一个板键,经过反复试验(+ stackoverflow),我使用了此功能:
sort(function(a, b) {
return a.plate.toLowerCase() > b.plate.toLowerCase() ? a.plate.localeCompare(b.plate): -1;
});
输出此命令。
[ "245/TAE.", "322(1)/SPA", "322(2)/SPA", "322(3)/SPA", "365/SDFA", "365/TRS", "964/ΜΕΝΤ."
, "SG/349(1)"
,"SG/349(3)"
,"SG/PASD."
,"SG/Χ''RAS."
,"SOTRA/Χ''SIMOTSEOY"]
这在某种程度上是可行的选择,但我的期望结果是:
["SOTRA/Χ''IMOTSEOY", "SG/Χ''RAS.", "SG/PASD.", "SG/349(1)"
,"SG/349(3)"
, "245/TAE.", "322(1)/SPA", "322(2)/SPA", "322(3)/SPA", "365/SDFA", "365/TRS.", "964/ΜΕΝΤ."
]
任何仅包含字母的内容都将排在首位,然后是第一个字符是字母,然后是第一个字符是数字升序。
我确实尝试了一些反转元素或使用正则表达式的变体,但效果不理想。
在前端使用Vuejs,这是jsfiddle。
答案 0 :(得分:1)
使用自定义排序顺序,您需要更复杂的排序功能。可以使用多种方法,但是可以使用评分功能(可能会缓存此值,具体取决于项目数)
function scoreIt(n){
// does n contain any digits?
if(/[0-9]/.test(n)){
// is the first char a letter?
if(/^[a-z]/.test(n)){
return 1; // first char is a letter and there are digits somewhere
}else{
return 2; // first char is not a letter
}
}else{
return 0; // no digits
}
}
然后,在您的排序功能中,将其用作:
let a0 = a.plate.toLowerCase(), b0 = b.plate.toLowerCase(),
a1 = scoreIt(a0), b1 = scoreIt(b0);
if(a1 == b1){
// your original code
return a0 > b0 ? a.plate.localeCompare(b.plate): -1;
} else {
return a1-b1;
}