`
JavaSam
  • 浏览: 932940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javascript 排序,分组小工具 - 支持JSON数组 原生数组(学习,持续更新)

 
阅读更多
/**
 * @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);

 

 

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics