使用jquery

时间:2015-05-13 21:09:40

标签: javascript jquery sorting

我正在尝试使用具有如下函数的jquery对表行进行排序:

                var items = $('#dp_content_table > tbody > tr').sort(function(a, b) {
                    var vA = $(a).attr('id');
                    var vB = $(b).attr('id');

                    var arrA = vA.split('_');
                    var arrB = vB.split('_');

                    return (arrA[1] < arrB[1]) ? -1 : (arrA[1] > arrB[1]) ? 1 : (arrA[1] == arrB[1] && arrA[5] < arrB[5]) ? -1 : (arrA[1] == arrB[1] && arrA[5] > arrB[5]) ? 1 : 0;
                });

                    $('#dp_content_table > tbody > tr').append(items);

基本上,我使用ID作为排序属性。该属性包含day&amp;时间。 attr [1]是白天,而attr [5]是时间。如果A行中的天数小于B,则无需比较时间和返回结果,另一方面,如果天数相同,则比较第二个属性即时间,依此类推。

但是,到目前为止,我没有运气对它们进行排序。我的表似乎根本没有生效。

先谢谢。

2 个答案:

答案 0 :(得分:0)

您可以比较jquery中的日期。也许它可以帮助你。

https://stackoverflow.com/a/18913695/3617531

无论如何,在你的代码中,你正在使用split,然后你正在进行字符串比较,而不是第一。您可能应该将它们转换为整数:

            var items = $('#dp_content_table > tbody > tr').sort(function(a, b) {
                var vA = $(a).attr('id');
                var vB = $(b).attr('id');

                var arrA = vA.split('_');
                var arrB = vB.split('_');

                return (parseInt(arrA[1]) < parseInt(arrB[1])) ? -1 : (parseInt(arrA[1]) > parseInt(arrB[1])) ? 1 : (parseInt(arrA[1]) == parseInt(arrB[1]) && parseInt(arrA[5]) < parseInt(arrB[5])) ? -1 : (parseInt(arrA[1]) == parseInt(arrB[1]) && parseInt(arrA[5]) > parseInt(arrB[5])) ? 1 : 0;
            });

                $('#dp_content_table > tbody > tr').append(items);

答案 1 :(得分:0)

jQuery的排序是内置的 Array.prototype.sort ,传递给它的值是选择器返回的DOM元素,因此要very much more efficient替换$(a).attr('id')a.id。打字也少得多。

如果ID是ISO 8601格式的日期字符串,则可以将它们排序为字符串而不转换为数字或日期:

<table>
  <tr id="2015-05-16T10:00:00.000Z">
   <td>2015-05-16T10:00:00.000Z
  <tr id="2015-05-16T09:00:00.000Z">
   <td>2015-05-16T09:00:00.000Z
  <tr id="2015-05-16T11:00:00.000Z">
   <td>2015-05-16T11:00:00.000Z
<table>

<script>
(function() {
  var rows = $('tr').sort(function(a, b){
    return a.id < b.id ? -1 : a.id > b.id? 1 : 0;
  })

  $('table > tbody').append(rows);
}());
</script>

但是,id确实不应该像这样使用,更好的是将值设置在 data * 属性中,因为您可能希望具有相同的值。

修改

添加指向jsperf的链接。