Сортировка массива строк римских и арабских чисел в JS - PullRequest
0 голосов
/ 19 марта 2019

Мой массив содержит список арабских и римских чисел в виде строки. Я хотел бы отсортировать их в порядке возрастания римских чисел, а затем арабских чисел в порядке возрастания. Я пишу код, как показано ниже,

var myarray = ["i", "ii", "iii", "xv", "x", "1", "2", "3", "5", "601", "vi", "vii", "88", "99", "201", "101", "xix", "125", "iv", "vi", "v", "xiv", "58"]
myarray.sort(function (a, b) {
  try {
    if (Number(a) != null)
      a = Number(a);
    if (Number(b) != null)
      b = Number(b);
  } catch (e) {}
  if (a > b) {
    return 1;
  }
  if (b > a) {
    return -1;
  }
  if (a == b) {
    return a.position - b.position;
  }
});
console.log(myarray);

Но результаты, как, Результаты: ii,iii,xv,x,1,2,3,5,v,vi,vii,vi,iv,xix,xiv,58,88,99,101,125,201,601,i Если я не преобразовал строку в числа, Результаты: 1,101,125,2,201,3,5,58,601,88,99,i,ii,iii,iv,v,vi,vi,vii,x,xiv,xix,xv Мой ожидаемый результат должен быть Результаты: i,ii,iii,iv,v,vi,vi,vii,x,xiv,xv,xix,1, 2, 3,5,58,88,99,101,125,201,601

1 Ответ

0 голосов
/ 21 марта 2019

Несколько вещей здесь:

  • Вам не нужен блок try / catch. Просто оставь это.
  • Проверка проанализированного числа на ноль не даст ожидаемого результата. Вам нужно проверить на NaN.
  • Либо анализируйте оба значения по числу, либо ни по одному. В противном случае вы не можете сравнить должным образом.
  • Обычно числа возвращаются перед строками. Чтобы избежать этого, вам нужно инвертировать значение результата путем умножения на -1, если одно значение является числом, а другое - строкой.

Вот рабочая версия метода сортировки:

var myarray = ["i", "ii", "iii", "xv", "x", "1", "2", "3", "5", "601", "vi", "vii", "88", "99", "201", "101", "xix", "125", "iv", "vi", "v", "xiv", "58"]
myarray.sort(function (a, b) {
  if (!isNaN(Number(a)) && !isNaN(Number(b))) {
    a = Number(a);
    b = Number(b);
  }
  var result;
  if (a > b) {
    result = 1;
  }
  if (b > a) {
    result = -1;
  }
  if (a == b) {
    result = a.position - b.position;
  }
  if (isNaN(Number(a)) !== isNaN(Number(b))) {
    result = result * -1;
  }
  return result;
});
console.log(myarray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...