这是账单清单:
Service Price
---------------
S1 13 CHF
S2 Free
S3 Free
S4 40 CHF
我想使用 jQuery 或纯 JavaScript 按价格对其进行排序。(不是服务器端)
我尝试了jQuery Tablesorter,但失败了。因为有些价格不是数字。( Free
)
我能做些什么?Tablesorter 可以支持吗?或者我应该使用其他插件...
这是账单清单:
Service Price
---------------
S1 13 CHF
S2 Free
S3 Free
S4 40 CHF
我想使用 jQuery 或纯 JavaScript 按价格对其进行排序。(不是服务器端)
我尝试了jQuery Tablesorter,但失败了。因为有些价格不是数字。( Free
)
我能做些什么?Tablesorter 可以支持吗?或者我应该使用其他插件...
以下是一些自定义排序代码,假设如下:
items
tr
您要排序的每一行 ( ) 都有类item
td
) 都有类price
然后只需包含以下 jQuery 代码并在您想要排序时调用该函数:(这是一个演示)
var sorted_by_price = false;
function sortByPrice() {
$('#items').append(
$('#items').find('tr.item').sort(function (a, b) {
var td_a = $($(a).find('td.price')[0]);
var td_b = $($(b).find('td.price')[0]);
if(sorted_by_price){
if(td_a.html() == 'Free') return 1;
return td_b.html().replace(/\D/g, '') - td_a.html().replace(/\D/g, '');
}else{
if(td_a.html() == 'Free') return -1;
return td_a.html().replace(/\D/g, '') - td_b.html().replace(/\D/g, '');
}
})
);
if(sorted_by_price) sorted_by_price = false;
else sorted_by_price = true;
}
如果您不想使用繁重的插件,则无法手动对其进行排序:
$(function(){
var table=$('#table');
var rowsArray=$('tr',table).sort(function(current,next){
var compareCurrent=$('td.price',current).text().toUpperCase();
var compareNext=$('td.price',next).text().toUpperCase();
return (compareCurrent<compareNext)? -1 : (compareCurrent > compareNext) ? 1 : 0;
});
$('tr',table).remove();
$.each(rowsArray,function(index,element){
$(element).appendTo(table)
})
})
在此示例中,您应该将“价格”类添加到带有价格的单元格。或者你可以使用伪选择器“:last-child”。
您可以使用 DataTables ( http://www.datatables.net/ )。这是一个非常强大的 JS 插件。
您可以编写自己的解析器。请参阅以下文档:http ://tablesorter.com/docs/example-parsers.html
工作示例:
$.tablesorter.addParser({
id: 'price',
is: function(s) {
return false;
},
format: function(s) {
return s.replace(/Free/,0).replace(/ CHF/,"");
},
type: 'numeric'
});
$(function() {
$("table").tablesorter({
headers: {
1: {
sorter:'price'
}
}
});
});
因为您有自定义的非数字值要排序,所以您将需要某种自定义排序功能。这是您的表格的自定义排序例程:
HTML:
<table id="service">
<tr><td class="sortBy" data-sortType="findNumber">Service</td><td class="sortBy" data-sortType="numeric">Price</td></tr>
<tr><td>S1</td><td>13 CHF</td></tr>
<tr><td>S2</td><td>Free</td></tr>
<tr><td>S3</td><td>Free</td></tr>
<tr><td>S4</td><td>40 CHF</td></tr>
</table>
代码:
$(".sortBy").click(function() {
var self = $(this);
var tbody = self.closest("tbody");
// determine which column was clicked on
var column = self.index();
// get the sort type for this column
var sortType = self.data("sortType");
var sortCells = [];
// get all rows other than the clicked on row
// find the right column in that row and
// get the sort key from it
$(this).closest("tr").siblings().each(function() {
var item = $(this).find("td").eq(column);
var val = item.text();
var matches;
if (sortType == "numeric") {
if (val.toLowerCase() == "free") {
val = 0;
} else {
val = parseInt(val, 10);
}
} else {
// find numbers in the cell
matches = val.match(/\d+/);
if (matches) {
val = parseInt(matches[0], 10);
} else {
val = 0;
}
}
sortCells.push({cell: item, data: val});
});
// sort by the key
sortCells.sort(function(a, b) {
return(a.data - b.data);
});
// reinsert into the table in sorted order
for (var i = 0; i < sortCells.length; i++) {
sortCells[i].cell.parent().appendTo(tbody);
}
});
工作演示:http: //jsfiddle.net/jfriend00/3w9gQ/