/** * @author wsf 数据分组,排序js */ ; (function(win, $) { var _jsUtils = null; if(jsUtils) _jsUtils = new jsUtils();//js工具对象 //分组排序对象 function groupSorter() { //数据 this.data = null; //排序方式 this.sortType = [ 'asc', 'desc' ]; //默认排序方法 this.defaultsortType = this.sortType[0]; //排序名称 this.sorteName = null; //分组名称 this.groupName = null; } //原型对象 groupSorter.prototype = { //构造函数 constructor : groupSorter, //所有操作前的数据检测 dataCheck : function() { var _isAry = _jsUtils.isArray(this.data);//是否是数组 var _isJSON = _jsUtils.isJSON(this.data[0]);//是否是json数组 if (_isAry) { this.isAry = true; } else if (_isJSON) { this.isJSONAry = true; } else { throw new Error("数据有误!"); } this.checked = true//已经做过数据检查 }, //线性查找 lineSearch : function(key, val) { var i = this.data.length - 1; do { var _a = val?this.data[i--][val]:this.data[i--]; var _b = val?this.data[key]:key; if (_a === _b) return i + 1; } while (i >= 0); return -1; }, //二分查找 (必须为有序可比较数组) binarySearch : function(key, val) { var low = 0, high = this.data.length - 1; do { var mid = Math.floor((low + high) / 2); var mdata = val?this.data[mid][val]:this.data[mid]+""; key = val:this.data[key]:key+""; //向下取整数 if (key === mdata) return val?this.data[mid]:mid; if (key.localeCompare(mdata) < 0) high = mid - 1; else low = mid + 1; } while (low <= high); return -1; }, //原生js排序 systemSorter:function (sortName){ this.data.sort(function (a,b){ var _a = sortName?a[sortName]:a+""; var _b = sortName?b[sortName]:b+""; var _f = this.sortType == "asc"?_a.localeCompare(_b):_b.localeCompare(_a); return _f; }); }, //冒泡排序(数据量小的时候用【数据量大时效率差】) bubbleSorter:function (sortName){ var i = 0,arry = this.data,len = arry.length,j,d; for(;i<len;i++){ for(j=0;j<len;j++){ var d1 = sortName?array[i][sortName]:arry[i]+""; var d2 = sortName?array[j][sortName]:arry[j]+""; var _ret = this.sortType == "asc" ? d1.localeCompare(d2)<0:d1.localeCompare(d2)>0; if(_ret){ d = arry[i]; arry[j] = arry[i]; arry[i] = d; } } } }, //快速排序(效率最好) quickSort:function (sortName){ var i = 0,arry = this.data,j=arry.length-1 //排序实现 var sorter = function (i,j){ if(i==j){ return; } var key = sortName?array[i][sortName]:arry[i]; var stepi = i;//记录开始位置 var stepj = j//记录结束位置 while(j>i){ var d1 = sortName?array[j][sortName]:arry[j]+""; key = key+""; if(d1.localeCompare(key)>=0){ j--; }else{ arry[i] = arry[j]; while(j>i++){ if(d1.localeCompare(key)>0){ arry[j] = arry[i]; break; } } } } //如果第一个取出的key是最小数 if(stepi == i){ soter(++i,stepj); return; } //最后一个空位留给key arry[i] = key; sorter(stepi,i); sorter(j,stepj); } sorter(i,j); } } win.groupSorter = groupSorter;//外部调用入口 /** * 调用方式 * var _sorter = new groupSorter(); * _sorter.data = yourData; * _sorter.quickSort(sortName); */ })(window,jQuery);