javascript
深入探讨JS中的数组排序函数sort()和reverse()
最近在研究Javascript發(fā)現(xiàn)了其中一些比較靈異的事情。有點(diǎn)讓人感到無(wú)語(yǔ)比如:
alert(typeof( NaN == NaN));//結(jié)果為假。
alert(typeof( NaN != NaN));//結(jié)果為真。
嘿嘿,當(dāng)然這個(gè)不是這篇文章要討論的!!開始我們的正文
首先,我們來(lái)看一下JS中sort()和reverse()這兩個(gè)函數(shù)的函數(shù)吧
reverse();這個(gè)函數(shù)是用來(lái)進(jìn)行倒序,這個(gè)沒(méi)有什么可說(shuō)的,所謂倒序就是大的在前面,小的在后面。
比如:
var array1 = [0,1,5,10,15];
array1.reverse();//結(jié)果為:15,10,5,1,0
sort([參數(shù)]);這個(gè)函數(shù)是用來(lái)對(duì)數(shù)組進(jìn)行正序排列的,但是,我發(fā)現(xiàn)了,大家好像都比較常規(guī)的把這個(gè)函數(shù)給大多數(shù)語(yǔ)言一樣的使用!!但是,沒(méi)錯(cuò),你發(fā)現(xiàn)了這個(gè)函數(shù)其實(shí)是有參數(shù)的。
反正,在我們學(xué)習(xí)JS這門課程的時(shí)候,老師是沒(méi)有講解這個(gè)函數(shù)是有這個(gè)參數(shù)的。
剛剛我已經(jīng)說(shuō)了,它給我們其它語(yǔ)言的正序排列函數(shù)是有區(qū)別的,給大家舉個(gè)例子吧.
var array1 = [0,1,5,10,15];
array1.sort();//結(jié)果為:0,1,10,15,5
大家可以自己去試試看看是不是這個(gè)結(jié)果!!當(dāng)我看到結(jié)果的時(shí)候,有點(diǎn)不知道為什么。難道,這個(gè)函數(shù)不是做正序排列,于是去網(wǎng)上找了相關(guān)資料,在W3CSchool中看到,這個(gè)函數(shù)的一些說(shuō)明。如下圖
?
?
大家仔細(xì)閱讀上圖中的解釋,其中我用紅線部分的地方,是這個(gè)函數(shù)在進(jìn)行排序的過(guò)程影響其值的根本原因。(其實(shí),在使用sort()進(jìn)行排序的時(shí)候會(huì)調(diào)用toString()函數(shù)將其值轉(zhuǎn)換成字符串在進(jìn)行比較,是按ASCII進(jìn)行比較的)
哪么不難理解:1的ASCII值肯定要比5的ASCII值小,由于是正序哪么越小的就越在前面!!哪么我們要怎么做才能正確的使其排序達(dá)到我們想要的效果 呢。這個(gè)時(shí)候,就會(huì)使用,sort()中的參數(shù)了。這參數(shù)指向的是一個(gè)函數(shù)!我相信大家看到上面的圖,我就不在做過(guò)多的解釋了。看一下,下面的代碼,我在 分析一下,他的實(shí)現(xiàn)過(guò)程吧。
?
function con(v1,v2) {if (v1<v2) {return -1; }else if(v1>v2){return 1;}else{return 0;} }?
?
注:sort() 方法可以接受一個(gè) 方法為參數(shù) ,這個(gè)方法有兩個(gè)參數(shù)。分別代表每次排序比較時(shí)的兩個(gè)數(shù)組項(xiàng)。sort()排序時(shí)每次比較兩個(gè)數(shù)組項(xiàng)都回執(zhí)行這個(gè)參數(shù),并把兩個(gè)比較的數(shù)組項(xiàng)作為參數(shù)傳遞 給這個(gè)函數(shù)。當(dāng)函數(shù)返回值為1的時(shí)候就交換兩個(gè)數(shù)組項(xiàng)的順序,否則就不交換。
首先,要說(shuō)明一下!排序算法是離不開冒泡算法的!這里同樣是使用了冒泡算法,但是我們要怎么來(lái)理解這個(gè)算定義函數(shù)呢!
這個(gè)算定義函數(shù)必須有兩個(gè)參數(shù)(這個(gè)在進(jìn)行排序,換而言之就是誰(shuí)大誰(shuí)就在前面!!就是比較大小。)
函數(shù)的的意思是,當(dāng)v1<V2為-1,V1>v2為1,v1==v2為0
<V2為-1,V1>
<V2為-1,V1>
根據(jù)冒泡算法:傳遞兩個(gè)值給v1和v2,array[0] ="0",array[1]="2" 那么,v1=0,v2=2,
第一輪:按照上面的規(guī)定,不交換位置,那么第一次下來(lái)是:0,2,1,0.5因?yàn)?比任何的數(shù)都小所以第一輪結(jié)束,他始終在最前面我就不分析了
第二輪:v1=2,v2=1;
第一次:由于v1>v2所以v1和v2的值交換位置結(jié)果為:0,1,2,0.5;
第二次:這個(gè)時(shí)候v1=1,v2=2進(jìn)行比較結(jié)題為:0,1,2,0.5,
第三次:這個(gè)時(shí)候v1=1,v2=0.5由于v1>v2所以v2和v2交換位置,其結(jié)果為:0,0.5,1,2
第四次:這個(gè)時(shí)候v1=0.5,v2=2進(jìn)行比較其結(jié)果為:0,0.5,1,2
第三輪:v1=1,v2=2;
第一次:進(jìn)行比較其結(jié)果為0,0.5,1,2這個(gè)時(shí)候由于已經(jīng)到數(shù)組的么尾了。退出函數(shù)。返回結(jié)果。
好了,這個(gè)就是sort()函數(shù)的一個(gè)探討,希望,大家看完此文章對(duì)JS的排序函數(shù)有一個(gè)比較深入的了解。當(dāng)然,我講解的這種寫法是一種比較通用的寫法, 大家也可以按照自己的需要寫一下,倒序,大、小寫等 等 ...這里就不在多說(shuō)了!!可能有些許地方,講解得不夠好。希望大家能夠諒解。如果有什么疑問(wèn),請(qǐng)?jiān)谖恼孪旅媪粞浴?/p>
轉(zhuǎn)載于:https://www.cnblogs.com/RuMengkai/p/6501408.html
總結(jié)
以上是生活随笔為你收集整理的深入探讨JS中的数组排序函数sort()和reverse()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java访问权限的范围
- 下一篇: SpringMVC搭建+实例