В моей таблице есть столбцы, которые генерируются динамически. В таблице есть столбцы типа «Имя», «Компания» и т. Д. Также есть столбец, содержащий номера версий (1.14.0.2, 1.12.1.0, 1.8.0.1).
Я использую библиотеку под названием Сортируемый для сортировки на месте. Это отличная библиотека, которая работает только из коробки!
Это хорошо работает для столбцов, таких как имя и компания. Но это не удается для номера версии в некоторых случаях. Я устанавливаю значение данных для результата
str_replace('.','',$version_number)
Но происходит сбой, когда номера версий 1.10.0, 1.14, 1.0.1.2 (особый случай)
Должно сортироваться как
1.0.1.2
1.10.0
1.14
Но это вроде как
1.14
1.0.1.2
1.10.0
Как я могу добиться правильных результатов?
Это происходит так, потому что происходит сортировка по значению данных, которое вы устанавливаете в число без точек.
1.14 --> 114 (smallest)
1.0.1.2 --> 1012
1.10.0 --> 1100 (largest)
Если вы оставите data-value
атрибут отсутствует или оставьте точки в номерах версий, он будет отсортирован правильно. Как показано на скрипке ниже.
https://jsfiddle.net/t7xhkkjc/
редактировать
Вам нужно добавить пользовательскую функцию сортировки, чтобы правильно сортировать номера версий
// Credit for function http://stackoverflow.com/a/7717160/769237
var customTypes = [{
name: 'version',
defaultSortDirection: 'descending',
match: function(a) {
return a.match(/([1-9]+\.?)+/g);
},
compare: function (a, b) {
var i, cmp, len, re = /(\.0)+[^\.]*$/;
a = (a + '').replace(re, '').split('.');
b = (b + '').replace(re, '').split('.');
len = Math.min(a.length, b.length);
for( i = 0; i < len; i++ ) {
cmp = parseInt(a[i], 10) - parseInt(b[i], 10);
if( cmp !== 0 ) {
return cmp;
}
}
return a.length - b.length;
}
}];
Чтобы вы не потеряли исходные типы сортировки, переопределив их
var customAndOriginalTypes = Sortable.types.concat(customTypes);
Sortable.setupTypes(customAndOriginalTypes);
Также вам нужно отключить автоинициализацию, удалив data-sortable
с вашего стола. Это позволяет добавить новый тип сортировки до добавления функции сортировки в таблицу.
Затем вы можете инициализировать сортировку таблицы
var yourTable = document.querySelector('#your-table');
Sortable.initTable(yourTable);
Других решений пока нет …