我正在尝试创建一个可以更改列的排序行为的插件。列中的数据是<ul>
元素。在列表的每个<li>
元素中,有一些文本和十进制数字。我想根据单元格列表中的最大十进制数对表进行排序。这是一个显示插件的jsfiddle,正如您所看到的,当您对第二列进行排序时,它无法正常工作:
http://jsfiddle.net/flyingL123/1whzq1w2/3/
如果有效,降序应该是Sam(97.50),Joe(80.50),Mike(17.50),升序当然应该是相反的。根据我的调试,插件返回每个单元格的正确数值。你知道为什么不对表进行相应的排序吗?
以下是插件中的代码:
$.fn.dataTable.ext.order['number-list'] = function ( settings, col )
{
return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
//get all numbers from the cell into an array and parseFloat each one
var nums = $(td).html().match(/(\d+.\d+)/);
if(nums){
nums = nums.map(function(val){return parseFloat(val, 10);});
return Math.max.apply(null, nums);
}
else{
return 0;
}
} );
}
答案 0 :(得分:2)
注意:此答案已完全重写。
关于dataTables自定义排序和自定义数据源
最初的答案是dataTables所谓的基于类型的排序。 dataTables诞生了基本&#34;原语的排序功能&#34;或类型:string
,numeric
,date
和html
。默认情况下,dataTables会尝试猜测列包含哪种类型的数据,然后用户单击表标题,表将根据检测到的类型进行排序。您可以使用sType
/ type
选项(如sType : 'string'
)强制类型到特定列,如果需要某种方式,或者dataTables未检测到类型正确。例如,您希望将列排序为数字,但dataTables按字母顺序排序,然后您可以设置sType : 'numeric'
。
显然,内置排序功能并不总能满足所有需求,例如您的示例。在这种情况下,您可以创建一个新的type
,如您在原始答案中看到的或在其他自定义排序插件中看到的。例如。在方案oSort
,type-pre
,type-desc
之后将对象添加到type-asc
。这些函数定义不是强制性的,而是dataTables将响应的那些函数定义。例如,type-pre
- 预处理函数 - 不是强制性的,但如果在调用实际排序函数之前内容需要特殊处理,则非常有用。
dom-text
(及其类似)基本上是一个独立的type-pre
。如果您只是希望排序算法对列内容的某个部分进行排序,而不需要全新的排序算法,这将非常有用。 dataTables将其定义为custom data source sorting
。例如,如果您有一个名称为firstname lastname
的列,但想要对lastname
进行排序,那么这就是您的选择。
非常好的是,您可以结合以上所有内容。默认排序,默认类型检测,强制类型,自定义排序插件和自定义数据源。
在这里我们有一个令人尴尬的部分:(我自己有很多需要特殊排序算法的情况,所以我已经所以习惯于将自定义排序插件一起猛击,我只是忽略了你想要做的事情:(我真的不记得确切的情况,但很明显我在早上9点喝咖啡时看到了你的问题,然后用自动驾驶仪上的自定义排序插件回答。
我明白为什么你在想 - 你是绝对正确的。您问题中的代码也是正确的。考虑一下我上面写的内容:您需要的是custom data source
和内置排序类型numeric
的组合。真正的答案是你非常接近,你只是忘了设置type
,这是nessecary,因为默认的排序类型是string
。所以
var myDataTable = $('#myTable').DataTable({
"columns":[
null,
{"orderDataType":"number-list", type: 'numeric'} // <--- just set the type to numeric
],
"order":[],
});
就是这样!这是你原来的小提琴 - &gt;的 http://jsfiddle.net/rd0p6ts8/ 强>
很抱歉这个混乱。希望你能接受答案。