http://blog.sysuschool.com/u/mygod/index.html
请稍候,载入中。。。
 
请稍候,载入中。。。
2018/11/11 18:43:00
博文_终于理解了传参函数的用法
  一直对函数传参函数不理解,直到听完blue讲解的运动专题,才恍然大悟,想起数组排序方法arr.sort(),该方法可以传比较函数,实现数字数组的排序,该方法默认只返回字符串数组的排序(不是字符串也会被当做字符串排序),今天尝试了自己来写一个这样的数组排序方法,非常棒的感觉,写在这里,标记一下!

  假设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)...。

mygod | 阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:JavaScript 
  • 发表评论:
    请稍候,载入中。。。
    公告
    请稍候,载入中。。。
    时间记忆
    请稍候,载入中。。。
    最新日志
    请稍候,载入中。。。
    最新评论
    请稍候,载入中。。。
    最新回复
    请稍候,载入中。。。
    我的好友
    我的相册
    站点信息
    请稍候,载入中。。。
    生活因感动而精彩,理想在创造中放飞
    Powered by Oblog.