深入探討JS中的數組排序函數sort()和reverse()


 最近在研究Javascript發現了其中一些比較靈異的事情。有點讓人感到無語比如:

  alert(typeof( NaN == NaN));//結果為假。

  alert(typeof( NaN != NaN));//結果為真。

  嘿嘿,當然這個不是這篇文章要討論的!!開始我們的正文

  首先,我們來看一下JS中sort()和reverse()這兩個函數的函數吧

  reverse();這個函數是用來進行倒序,這個沒有什么可說的,所謂倒序就是大的在前面,小的在后面。

  比如:

  var array1 = [0,1,5,10,15];

  array1.reverse();//結果為:15,10,5,1,0

  sort([參數]);這個函數是用來對數組進行正序排列的,但是,我發現了,大家好像都比較常規的把這個函數給大多數語言一樣的使用!!但是,沒錯,你發現了這個函數其實是有參數的。

  反正,在我們學習JS這門課程的時候,老師是沒有講解這個函數是有這個參數的。

  剛剛我已經說了,它給我們其它語言的正序排列函數是有區別的,給大家舉個例子吧.

  var array1 = [0,1,5,10,15];

  array1.sort();//結果為:0,1,10,15,5

  大家可以自己去試試看看是不是這個結果!!當我看到結果的時候,有點不知道為什么。難道,這個函數不是做正序排列,於是去網上找了相關資料,在W3CSchool中看到,這個函數的一些說明。如下圖

  

 

  大家仔細閱讀上圖中的解釋,其中我用紅線部分的地方,是這個函數在進行排序的過程影響其值的根本原因。(其實,在使用sort()進行排序的時候會調用toString()函數將其值轉換成字符串在進行比較,是按ASCII進行比較的)

  哪么不難理解:1的ASCII值肯定要比5的ASCII值小,由於是正序哪么越小的就越在前面!!哪么我們要怎么做才能正確的使其排序達到我們想要的效果 呢。這個時候,就會使用,sort()中的參數了。這參數指向的是一個函數!我相信大家看到上面的圖,我就不在做過多的解釋了。看一下,下面的代碼,我在 分析一下,他的實現過程吧。

  

 

  注:sort() 方法可以接受一個 方法為參數 ,這個方法有兩個參數。分別代表每次排序比較時的兩個數組項。sort()排序時每次比較兩個數組項都回執行這個參數,並把兩個比較的數組項作為參數傳遞 給這個函數。當函數返回值為1的時候就交換兩個數組項的順序,否則就不交換。

  首先,要說明一下!排序算法是離不開冒泡算法的!這里同樣是使用了冒泡算法,但是我們要怎么來理解這個算定義函數呢!

  這個算定義函數必須有兩個參數(這個在進行排序,換而言之就是誰大誰就在前面!!就是比較大小。)

  函數的的意思是,當v1<V2為-1,V1>v2為1,v1==v2為0

<V2為-1,V1>

<V2為-1,V1>

  根據冒泡算法:傳遞兩個值給v1和v2,array[0] ="0",array[1]="2" 那么,v1=0,v2=2,

  第一輪:按照上面的規定,不交換位置,那么第一次下來是:0,2,1,0.5因為0比任何的數都小所以第一輪結束,他始終在最前面我就不分析了

  第二輪:v1=2,v2=1;

  第一次:由於v1>v2所以v1和v2的值交換位置結果為:0,1,2,0.5;

  第二次:這個時候v1=1,v2=2進行比較結題為:0,1,2,0.5,

  第三次:這個時候v1=1,v2=0.5由於v1>v2所以v2和v2交換位置,其結果為:0,0.5,1,2

  第四次:這個時候v1=0.5,v2=2進行比較其結果為:0,0.5,1,2

  第三輪:v1=1,v2=2;

  第一次:進行比較其結果為0,0.5,1,2這個時候由於已經到數組的么尾了。退出函數。返回結果。

  好了,這個就是sort()函數的一個探討,希望,大家看完此文章對JS的排序函數有一個比較深入的了解。當然,我講解的這種寫法是一種比較通用的寫法, 大家也可以按照自己的需要寫一下,倒序,大、小寫等 等 ...這里就不在多說了!!可能有些許地方,講解得不夠好。希望大家能夠諒解。如果有什么疑問,請在文章下面留言。

 

http://www.admin5.com/article/20120718/445724.shtml


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM