如何对具有软件版本号的表中的列进行排序?

时间:2016-04-03 22:52:37

标签: php html laravel jquery-ui-sortable

我的表中有一列是动态生成的。表格中包含Name,Company等列,还有包含版本号(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 个答案:

答案 0 :(得分:1)

它之类的排序是因为它按数据值排序,您将数字值设置为没有句点的数字。

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);

https://jsfiddle.net/p4w5bup3/