Как изменить этот код сортировки для пунктирных имен ячеек? - PullRequest
0 голосов
/ 28 августа 2018

Я использую этот код, благодаря этому посту :

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;

function sortAlphaNum(a, b) {
        var aA = a.replace(reA, "");
        var bA = b.replace(reA, "");
        if (aA === bA) {
            var aN = parseInt(a.replace(reN, ""), 10);
            var bN = parseInt(b.replace(reN, ""), 10);
            return aN === bN ? 0 : aN > bN ? 1 : -1;
        } else {
            return aA > bA ? 1 : -1;
        }
    }

Но то, что я пытаюсь отсортировать, немного сложнее:

У меня есть:

A1
A3
A5
A14
A6-1
A6-2

Я ожидаю:

A1
A3
A5
A6-1
A6-2
A14

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Со ссылкой https://stackoverflow.com/a/4340339/4225796 и благодаря @Leonid Pyrlia, а также по вашему вопросу вы судили то же самое, поэтому, используя тот же пример для справки,

мы можем удалить - и число после - по str.replace (/-.*/ g, "");

var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
var removeDash = /-.*/g;

var arr = ['A5','A3','A1','A14','A6-2','A6-1'];

console.log(arr.sort(sortAlphaNum));

function sortAlphaNum(a, b) {

a= a.replace(removeDash, "");
b= b.replace(removeDash, "");

  var aA = a.replace(reA, "");
  var bA = b.replace(reA, "");
  if (aA === bA) {
    var aN = parseInt(a.replace(reN, ""), 10);
    var bN = parseInt(b.replace(reN, ""), 10);
    return aN === bN ? 0 : aN > bN ? 1 : -1;
  } else {
    return aA > bA ? 1 : -1;
  }
}
0 голосов
/ 28 августа 2018

Вы можете разбить его на 3 критерия сортировки: 1) по первому символу 2) по второму номеру 3) по дополнительному третьему номеру (после тире -):

const arr = ['A5','A3','A1','A14','A6-2','A6-1'];

const sorted = arr.sort((a,b) => {

  const [[aChar, aN1, aN2],[bChar, bN1, bN2]] = [a,b].map(x => x.match(/([A-Z])|([0-9]+)/gi).map(el => Number(el) || el));

  const c1 = aChar.localeCompare(bChar);
  const c2 = aN1 - bN1;
  const c3 = (aN2 || 0) - (bN2 || 0);

  return c1 || c2 || c3;

});

console.log(sorted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...