#javascript #arrays #sorting
#javascript #массивы #сортировка
Вопрос:
Мой массив содержит список арабских и римских чисел в виде строки. Я хотел бы отсортировать их сначала по порядку возрастания римских цифр, затем по арабским цифрам в порядке возрастания. Я пишу код, как показано ниже,
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. Вы должны сортировать как параллельно, так и объединять массивы
Ответ №1:
Здесь несколько вещей:
- Вам не нужен блок try / catch. Просто оставьте это.
- Проверка проанализированного числа на null не даст вам ожидаемого результата. Вам нужно проверить наличие 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)) amp;amp; !isNaN(Number(b))) {
a = Number(a);
b = Number(b);
}
var resu<
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 resu<
});
console.log(myarray);