从基础的角度来谈谈javascript数组对象的sort()方法

SilentBlue

这大晚上的,明天还要码地,废话就不多说了,因为无意(-. -)看见了有不少同学问关于数组排序的问题,也有不少同学给出了很好的解答,给了我不少启发,感谢大家对我(-_ -)的帮助.另外感谢@xuexiphpa同学在js数组中的排序问题中给的推荐.

 
 关于数组排序的sort()方法(不带参数):
     <script type="text/javascript">
       var arr=["a","c","e","d","b"];
       var arr2=[1,20,15,30,6]
       doucment.write(arr.sort());
       doucment.write(arr2.sort());
     </script>  

那么上面的输出结果是什么呢?

   arr.sort()输出结果:a,b,c,d,e
   arr2.sort()输出结果:1,15,20,30,6

为什么是这样的结果呢?

在不带参数的情况下sort()方法默认会将数组元素当作string类型来升序排序,根据它们的unicode码从小到大依次排列.
我们先用charCodeAt获得一下它们的unicode值:

       元素 unicode 
       1     49
       15    49 53
       20    50 48
       30    51 48
       6     54

首先比较第一位的大小,相同的话比较第二位的unicode值的大小,所以就得出arr2的输出结果.

关于数组排序的sort(compareFun)方法(带参数):

   <script type="text/javascript">
       var arr2=[1,20,15,30,6]
       doucment.write(arr2.sort(function(a,b){return a-b;}));
   </script>  

输出结果:1,6,15,20,30
为什么呢?查手册我们知道

   a-b<0  a将会放在b前面  //a<b
   a-b=0  a,b的位置不改变
   a-b>0  b将会放在a前面  //a>b

这里a,b是数组内相邻的元素依次进行比较,比较结果按照上述规则调整位置,所以总是数值小的元素排在前面,即升序排列.

同样,如果要降序排序的话,doucment.write(arr2.sort(function(a,b){return b-a;}));按照上述规则就变成了:

   -(a-b)>0=>b-a>0=>b>a   b将会放在a前面
   a-b=0                  a,b的位置不改变
   -(a-b)<0=>b-a<0=>b<a   a将会放在b前面

注意:影响排序方式的是sort(compareFun(){return result;})参数返回结果与0的比较关系,至于(a-b)或是(b-a)它们是怎么被sort()识别判断而后又运算出结果的,看这里

   functin sort(functin(a,b){return result;}) {
        Native Code;
    }

从上述可以看出,对单纯的字符串(String)数组升序排序的话,sort()方法(无参数)比较适合;而在(Number)数组比较排序的时候,sort(compareFun)(带参数)更合适。

简单示意一下原理:
   <script type="text/javascript">
       function ascSort(){
         for (var i=0; i<this.length; i++){
            for(var j=0;j<this.length-i; j++){
              if(this[j]>this[j+1]){/*改成<就是降序*/
               var transferDate=this[j];
               this[j]=this[j+1];
               this[j+1]=transferDate;
             }
           }
        }
       return this;
      }
      Array.prototype.ascSort=ascSort;
      var arr2=[1,20,15,30,6];
      document.write(arr2.ascSort());
   </script>
  

关于这个问题,还请大家多指教,晚安!

阅读 2.9k

强迫症码农
一个身患强迫症的coder,在钻牛角尖的学习道路上一去不回头了
18 声望
1 粉丝
0 条评论
18 声望
1 粉丝
文章目录
宣传栏