如何对具有软件版本号的 table 中的列进行排序?
How to sort column in a table having software version numbers?
我的 table 中有一列是动态生成的。 Table 得到了名称、公司等列,它还得到了包含版本号(1.14.0.2、1.12.1.0、1.8.0.1)的列。
我正在使用名为 Sortable 的库进行就地排序。这是很棒的库,开箱即用!
它适用于名称和公司等列。但在某些情况下,版本号会失败。我将数据值设置为
的结果
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
属性,或者在版本号中保留句点,它会正确排序。如下面的 fiddle 所示。
https://jsfiddle.net/t7xhkkjc/
编辑
您需要添加自定义排序功能才能正确排序版本号
// Credit for function
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);
此外,您需要通过从 table 中删除 data-sortable
来禁用自动初始化。这允许您在将排序功能添加到 table.
之前添加新的排序类型
然后您可以使用
在 table 上初始化排序
var yourTable = document.querySelector('#your-table');
Sortable.initTable(yourTable);
我的 table 中有一列是动态生成的。 Table 得到了名称、公司等列,它还得到了包含版本号(1.14.0.2、1.12.1.0、1.8.0.1)的列。
我正在使用名为 Sortable 的库进行就地排序。这是很棒的库,开箱即用!
它适用于名称和公司等列。但在某些情况下,版本号会失败。我将数据值设置为
的结果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
属性,或者在版本号中保留句点,它会正确排序。如下面的 fiddle 所示。
https://jsfiddle.net/t7xhkkjc/
编辑
您需要添加自定义排序功能才能正确排序版本号
// Credit for function
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);
此外,您需要通过从 table 中删除 data-sortable
来禁用自动初始化。这允许您在将排序功能添加到 table.
然后您可以使用
在 table 上初始化排序var yourTable = document.querySelector('#your-table');
Sortable.initTable(yourTable);