js - Сортировка строк, начинающихся с буквы, длина которых больше, а затем строки, начинающиеся с меньшего числа до большего числа - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть массив объектов, в котором каждый объект имеет табличный ключ, после небольшого количества проб и ошибок (+ 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 Ответ

1 голос
/ 18 апреля 2020

С пользовательским порядком сортировки вам нужна более сложная функция сортировки. Есть много возможных способов сделать это, но функция оценки будет работать (возможно, кешировать это значение, в зависимости от количества элементов)

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...