摘要:下面重新改寫上面的冒泡排序,傳遞一個(gè)回調(diào)函數(shù)。模擬注意第行和第行,給傳遞了一個(gè)參數(shù),這是一個(gè)函數(shù),然后在第行調(diào)用,和分別就是回調(diào)函數(shù)的兩個(gè)比較值。
在JavaScript中,Array對象的sort()方法是用來排序的,但是這個(gè)方法在默認(rèn)情況下可能不是我們想要的,比如對于如下數(shù)組
var arr = [2,5,10,20,7,15];
使用sort排序會(huì)得到如下結(jié)果:
[10, 15, 2, 20, 5, 7]
在不傳遞參數(shù)的情況下,它是按字符的Unicode編碼來排序的。
為了解決這個(gè)問題,可以為sort()方法傳遞一個(gè)參數(shù),這個(gè)參數(shù)ECMAScript是這么定義的:
/** @param {function} [compareFn] @return {Array.} */ Array.prototype.sort = function(compareFn) {};
參數(shù)為一個(gè)function,具體叫比較函數(shù)。我們可以改寫為如下形式,傳遞一個(gè)比較函數(shù):
arr.sort(function(a,b){ return a - b; });
a和b即是要比較的兩個(gè)數(shù),其返回值如下:
若 a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前,則返回一個(gè)小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個(gè)大于 0 的值。
對于返回值的三種結(jié)果,我們可以直接使用“a-b”,這樣就可以正確得到結(jié)果
[2, 5, 7, 10, 15, 20]
那么,接下來我們就來模擬一下這個(gè)方法和比較函數(shù)的實(shí)現(xiàn)。
首先,如果我們不用這個(gè)方法,而是自己實(shí)現(xiàn)排序,那么我們可以使用傳統(tǒng)的冒泡排序方法:
function sort(array){ for(var i=0; iarray[j + 1]){ var temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; // 還有比較,說明排序還未結(jié)束 isSorted = false; } } // 如果排序已經(jīng)完成,跳出循環(huán) if(isSorted){ break; } } }
這是一個(gè)循環(huán)次數(shù)最少的排序方法,但是,這個(gè)排序的適應(yīng)性不強(qiáng),對于字符串?dāng)?shù)組就不行了,假設(shè)有如下字符串?dāng)?shù)組,要求按字符串個(gè)數(shù)排序該如何實(shí)現(xiàn)?
var arry = ["aaa","aa","c","bb"."xxxxxxxx"];
這樣的數(shù)組我們不得不重新寫一個(gè)方法來對字符串?dāng)?shù)組進(jìn)行排序,需要改動(dòng)上面冒泡排序的第6行的判斷條件:
if(array[j].length > array[j+1].length){}
那么,既然只需要改動(dòng)這一句,我們可以把這一句作為參數(shù)傳遞,以后想怎么排就傳什么樣的參數(shù),這個(gè)參數(shù)就是一個(gè)函數(shù),回調(diào)函數(shù)。下面重新改寫上面的冒泡排序,傳遞一個(gè)回調(diào)函數(shù)。
// 模擬sort() function sort(array,fn){ for(var i=0; i0){ var temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; isSorted = false; } } } if(isSorted){ break; } } }
注意第2行和第6行,給sort傳遞了一個(gè)fn參數(shù),這是一個(gè)函數(shù),然后在第6行調(diào)用,array[j]和array[j+1]分別就是回調(diào)函數(shù)的a,b兩個(gè)比較值。用這個(gè)改寫的方法即可對數(shù)值數(shù)組排序也可以對字符串?dāng)?shù)組排序了。
var arr = ["aaa","a","xxxxxx","abcd","ab"]; sort(arr, function (a,b) { return a.length - b.length; }); console.log(arr);
輸出:["a", "ab", "aaa", "abcd", "xxxxxx"]
文章首發(fā)于讀你博客,原文鏈接http://www.mybry.com/?p=594,轉(zhuǎn)載請注明出處
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79949.html
摘要:將元素作為對象的鍵,默認(rèn)鍵對應(yīng)的值為如果對象中沒有這個(gè)鍵,則將這個(gè)元素放入結(jié)果數(shù)組中去。 前言 數(shù)組去重在日常開發(fā)中的使用頻率還是較高的,也是網(wǎng)上隨便一抓一大把的話題,所以,我寫這篇文章目的在于歸納和總結(jié),既然很多人都在提的數(shù)組去重,自己到底了解多少呢。又或者是如果自己在開發(fā)中遇到了去重的需求,自己能想到更好的解決方案嗎。 這次我們來理一理怎么做數(shù)組去重才能做得最合適,既要考慮兼容性,...
摘要:總結(jié)我們繼續(xù)了我們數(shù)組系列的文章的,今天我們主要說的就是數(shù)組的如何轉(zhuǎn)換成其他數(shù)據(jù)類型,以及數(shù)組如何按照我們自己的規(guī)則去進(jìn)行排序。 今天我們繼續(xù)來介紹 Javascirpt 數(shù)組中的方法,也是數(shù)組系列的第四篇文章,因?yàn)閿?shù)組的方法眾多,每篇文章我們都對數(shù)組的每個(gè)方法都有比較細(xì)致的描述,只要你能夠從中成長一點(diǎn)點(diǎn),那我們的目的就達(dá)到了,學(xué)習(xí)是一個(gè)持續(xù)的,漸進(jìn)的過程。每天進(jìn)步一點(diǎn)點(diǎn),最終會(huì)有大成...
摘要:創(chuàng)建數(shù)組讀取和設(shè)置數(shù)組的值創(chuàng)建數(shù)組創(chuàng)建數(shù)組的基本方式有兩種使用構(gòu)造函數(shù)使用數(shù)組字面量表示法對于第一種方法,如果知道數(shù)組要保存多少個(gè)項(xiàng)目,也可以給構(gòu)造函數(shù)傳遞參數(shù),比如要?jiǎng)?chuàng)建值為的數(shù)組操作符可以省略。也可以向構(gòu)造函數(shù)傳遞包含的項(xiàng)。 Array 類型 除了Object 之外,Array 類型也是相當(dāng)常用的類型了。ECMAScript 數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。且數(shù)組大小也能夠動(dòng)態(tài)...
摘要:以上涉及到一個(gè)字符的轉(zhuǎn)換問題,這里不多擴(kuò)展,寫一段代碼運(yùn)行過程做筆記中國代表字符中的第一位,是只有長度的字符輸出字符長度為不確定時(shí)放入一個(gè)數(shù)組中。第一次運(yùn)行后,返回值為,小于,所以的索引值未變化,。 Array.sort() 方法排序,默認(rèn)為升序排序,如 1,2,3,4 這樣的排列,可以傳一個(gè)對比方法做為排序的參數(shù),也可以不傳,則為按照字符的逐個(gè) unicode 排序。 簡單默認(rèn)排序 ...
摘要:的內(nèi)置函數(shù)整理了一些語言精粹的方法一章的整理出的的內(nèi)置方法之后還會(huì)整理標(biāo)準(zhǔn)入門的新添加的方法整理這些作用一方面是更好的理解記憶另一方面是對于類數(shù)組可以使用原型鏈的調(diào)用即可中的一些函數(shù)輸出的為的結(jié)果因此的作用是連接數(shù)組當(dāng)然可以是數(shù)字也會(huì)加入到 Javascript的內(nèi)置函數(shù)(ES5) 整理了一些Javascript語言精粹的方法一章的整理出的ES5的內(nèi)置方法; 之后還會(huì)整理ES6標(biāo)準(zhǔn)入門...
閱讀 796·2021-11-12 10:36
閱讀 3376·2021-09-08 10:44
閱讀 2748·2019-08-30 11:08
閱讀 1405·2019-08-29 16:12
閱讀 2676·2019-08-29 12:24
閱讀 900·2019-08-26 10:14
閱讀 686·2019-08-23 18:32
閱讀 1176·2019-08-23 17:52