Вход

Просмотр полной версии : Сортировка массива


javaphp
05.03.2016, 19:04
Имеется массив
var arr = [ "art221827", "mus14111", "vid34343", "fol232926", "str34222", "sml161617", "all111456", "ind30040"]
Подскажите, как правильно его отсортировать. По отдельности методы для строк и для чисел не подходят. :help:

javaphp
05.03.2016, 19:05
Методы для строк и чисел по отдельности сортируют не так как необходимо(

рони
05.03.2016, 19:29
javaphp,
а как необходимо?

javaphp
05.03.2016, 19:45
нужно чтобы сначала сортировка была как для строк учитывая первые три буквы элементов массива, а дальше по числам. Проблема в том что числовая составляющая в элементах массива может быть разной длины

javaphp
05.03.2016, 19:53
если б строковая и числовая составляющие были одинаковые, то можно использовать сортировку для строк. Не пойму как правильно разбить каждый элемент на строковую составляющую и числовую. Сначала сортировать по той части которая строка а затем по числовой.

рони
05.03.2016, 20:37
javaphp,
результат сортировки напишите

javaphp
05.03.2016, 20:49
Вот например, второй и третий элементы отсортированы неправильно. нужно поменять их местами в результате.
function compareNumeric(a, b) {
if (a > b) return 1;
if (a < b) return -1;
}

var arr = [ "art221827", "mus141111", "mus14114", "vid34343", "fol232926", "str34222", "sml161617", "all111456", "ind30040"];

arr.sort(compareNumeric);

alert(arr);

javaphp
05.03.2016, 20:49
https://jsfiddle.net/9u9odnt2/

Lemme
05.03.2016, 20:53
var arr = [ "art221827", "mus14111", "vid34343", "fol232926", "str34222", "sml161617", "all111456", "ind30040"];

arr.sort((a,b) => {
var A = a.match(/(\D+)(\d+)/),
B = b.match(/(\D+)(\d+)/);

return A[1] > B[1] && +A[2] > +B[2] ? 1 : A[1] < B[1] && +A[2] < +B[2] ? -1 : 0
});

alert(arr);

рони
05.03.2016, 21:08
:-?
результат сортировки напишите

javaphp
05.03.2016, 21:14
Результат сортировки:
all111456, art221827, fol232926, ind30040, mus141111, mus14114, sml161617, str34222, vid34343

А должно получиться:
all111456, art221827, fol232926, ind30040, mus14114, mus141111, sml161617, str34222, vid34343

рони
05.03.2016, 21:18
javaphp,
<p> А должно получиться:</p>
<p>all111456, art221827, fol232926, ind30040, mus14114, mus141111, sml161617, str34222, vid34343</p>

<script>
var arr = [ "art221827", "mus141111", "mus14114", "vid34343", "fol232926", "str34222", "sml161617", "all111456", "ind30040"];
function fn(a,b)
{
var aa = a.replace(/\d+/g,""), bb = b.replace(/\d+/g,"");
a = a.replace(/\D+/g,"");
b = b.replace(/\D+/g,"");
return (aa > bb ) - (bb > aa) || a - b
}
arr.sort(fn);
document.write(JSON.stringify(arr))
</script>

javaphp
05.03.2016, 22:57
Уже разобрался. Рассмотрел 3 случая когда строковые части A и B: 1) < 2) > 3) == .

Если вариант 3) когда == , то сравнивал числовые части A и B. И все получилось.
Спасибо за подсказку с регулярными выражениями.