jQuery插件Asgrid添加表头排序的功能
在完成了Asgrid的基本功能后,还需要一个排序的功能。回想一下数据结构和算法,有很多的排序算法。在维基百科上找到的排序算法
在这里并不需要很复杂的排序,在这里我选择了快速排序算法
快速排序在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
添加表头点击事件
首先给控件添加两个新的参数用来记录当前的排序状态:
storKey :记录当前点击的表头列
order:记录当前排序,有两个值asc,desc
点击事件代码:
$(".AsGrid_head_col").click(function () { if (!def.data || def.data.length <= 1) return; var index = $(".AsGrid_head_col").index($(this)); if (index < 0) return; if (!def.columns[index].checkbox) { var key = def.columns[index].field; if (def.storKey == key) { //反向排序 def.order = def.order == 'asc' ? 'desc' : 'asc'; } else { def.storKey = key; def.order = 'asc'; } $(".head_ts").removeClass("head_ts_asc head_ts_desc"); $(this).find(".head_ts").addClass("head_ts_"+def.order); quickSort(def.data, def.storKey, def.order, 0, def.data.length - 1); methods.loadData(tb, def.data); }
其中quickSort为快速排序算法
排序算法
function quickSort(arr, key, order, low, high)
arr :要排序的数组
key:当前需要排序的列主键
order:正序(asc)还是反序(desc)
low:开始值
high:结束值
function quickSort(arr, key, order, low, high) { if (arr.lenght <= 1) return; if (low < high) { var pivot = arr[low]; var i = low; var j = high; if (order == 'asc') { while (i < j) { while (i < j && arr[j][key] >= pivot[key]) j--; arr[i] = arr[j]; while (i < j && arr[i][key] <= pivot[key]) i++; arr[j] = arr[i]; } arr[i] = pivot; } else { while (i < j) { while (i < j && arr[j][key] <= pivot[key]) j--; arr[i] = arr[j]; while (i < j && arr[i][key] >= pivot[key]) i++; arr[j] = arr[i]; } arr[i] = pivot; } quickSort(arr, key, order, low, i - 1); quickSort(arr, key, order, i + 1, high); }
一个没什么难度的算法,搞了半天,记录一下。