js-首先从字母开始对字符串进行排序,然后对其长度进行排序,然后将其长度从长到大依次排序,

时间:2020-04-18 13:47:49

标签: javascript arrays sorting vuejs2

我有一个对象数组,其中每个对象都有一个板键,经过反复试验(+ 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

1 个答案:

答案 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;
}