假设arr.sort()排序原理是利用冒泡排序,即一个数组中,从第一个开始,拿第一个与第二个进行比较,大的换到后面,再拿第二与第三比,同样大的放后面,直到全部,这样进行一轮,数组中最大的元素,会被放到最后;然后,同样道理进行第二轮比较,这轮不用比较最后一个元素,这样每轮减一个,进行n-1轮(假设数组有n个元素,需要进行n-1轮),两个for循环搞定,代码
for(var n=1;n<arr.length;n++){
for(var i=0;i<arr.length-n;i++){
if(arr[i]>arr[i+1]){
var tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
封装成函数bubble(),这里先传参arr对象,代码
function bubble(arr){
for(var n=1;n<arr.length;n++){
for(i=0;i<arr.length-n;i++){
if(arr[i]>arr[i+1]){
var tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
}
引入比较函数,因为默认可以比较字符串,这里写个用于数字比较的函数,很简单,传两个参数a,b(数字),返回相减的结果,大于0,说明a>b,代码
function compareNum(a,b){ return a-b;}
为了交代,再写个字符串比较的函数
function compareStr(a,b){
if(a>b){
return 1;
}else if(a==b){
return 0;
}else{
return -1;
}
}
这时,bubble函数要能用比较函数,则需要传参比较函数了,下面再次封装bubble(arr,fn),注意compareNum和compareStr,下面略了,要有,前后无所谓,js中function声明的函数会提前的,代码
function bubble(arr,fn){
for(var n=1;n<arr.length;n++){
for(i=0;i<arr.length-n;i++){
if(fn(arr[i],arr[i+1])>0){
var tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
}
上面这种写法已经可以比较字符串和数字数组了,不过在调用时,需要传入具体函数名,如有一个数字类的数组,要按数字排序,则传compareNum,如 bubble(arr,compareNum),这里arr为要排序的数组对象,compareNum即为传入的函数,这里一定不能加().
要模拟类似arr.sort(),即数组对象的方法,需要在数组对象的原型prototype上添加共有方法,下面是我添加的bubble方法,可传比较函数,也可以不传,不传按字符串排序,且比较函数可传匿名函数。
Array.prototype.bubble=function(fn){
for(var n=1;n<arr.length;n++){
for(i=0;i<arr.length-n;i++){
if(fn){
if(fn(arr[i],arr[i+1])>0){
var tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}else{
if((''+arr[i])>(''+arr[i+1])){
var tmp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=tmp;
}
}
}
}
}
由于使用对象,用this取代arr,不需要传参arr,调用时用arr.bubble()调用该方法,另外传参fn,注意函数体内需要判断有无fn,方法时if(fn)...。