摘要:下面重新改寫上面的冒泡排序,傳遞一個回調函數。模擬注意第行和第行,給傳遞了一個參數,這是一個函數,然后在第行調用,和分別就是回調函數的兩個比較值。
在JavaScript中,Array對象的sort()方法是用來排序的,但是這個方法在默認情況下可能不是我們想要的,比如對于如下數組
var arr = [2,5,10,20,7,15];
使用sort排序會得到如下結果:
[10, 15, 2, 20, 5, 7]
在不傳遞參數的情況下,它是按字符的Unicode編碼來排序的。
為了解決這個問題,可以為sort()方法傳遞一個參數,這個參數ECMAScript是這么定義的:
/** @param {function} [compareFn] @return {Array.} */ Array.prototype.sort = function(compareFn) {};
參數為一個function,具體叫比較函數。我們可以改寫為如下形式,傳遞一個比較函數:
arr.sort(function(a,b){ return a - b; });
a和b即是要比較的兩個數,其返回值如下:
若 a 小于 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個大于 0 的值。
對于返回值的三種結果,我們可以直接使用“a-b”,這樣就可以正確得到結果
[2, 5, 7, 10, 15, 20]
那么,接下來我們就來模擬一下這個方法和比較函數的實現。
首先,如果我們不用這個方法,而是自己實現排序,那么我們可以使用傳統的冒泡排序方法:
function sort(array){ for(var i=0; iarray[j + 1]){ var temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; // 還有比較,說明排序還未結束 isSorted = false; } } // 如果排序已經完成,跳出循環 if(isSorted){ break; } } }
這是一個循環次數最少的排序方法,但是,這個排序的適應性不強,對于字符串數組就不行了,假設有如下字符串數組,要求按字符串個數排序該如何實現?
var arry = ["aaa","aa","c","bb"."xxxxxxxx"];
這樣的數組我們不得不重新寫一個方法來對字符串數組進行排序,需要改動上面冒泡排序的第6行的判斷條件:
if(array[j].length > array[j+1].length){}
那么,既然只需要改動這一句,我們可以把這一句作為參數傳遞,以后想怎么排就傳什么樣的參數,這個參數就是一個函數,回調函數。下面重新改寫上面的冒泡排序,傳遞一個回調函數。
// 模擬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傳遞了一個fn參數,這是一個函數,然后在第6行調用,array[j]和array[j+1]分別就是回調函數的a,b兩個比較值。用這個改寫的方法即可對數值數組排序也可以對字符串數組排序了。
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"]
文章首發于讀你博客,原文鏈接http://www.mybry.com/?p=594,轉載請注明出處
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/79949.html
摘要:總結我們繼續了我們數組系列的文章的,今天我們主要說的就是數組的如何轉換成其他數據類型,以及數組如何按照我們自己的規則去進行排序。 今天我們繼續來介紹 Javascirpt 數組中的方法,也是數組系列的第四篇文章,因為數組的方法眾多,每篇文章我們都對數組的每個方法都有比較細致的描述,只要你能夠從中成長一點點,那我們的目的就達到了,學習是一個持續的,漸進的過程。每天進步一點點,最終會有大成...
摘要:創建數組讀取和設置數組的值創建數組創建數組的基本方式有兩種使用構造函數使用數組字面量表示法對于第一種方法,如果知道數組要保存多少個項目,也可以給構造函數傳遞參數,比如要創建值為的數組操作符可以省略。也可以向構造函數傳遞包含的項。 Array 類型 除了Object 之外,Array 類型也是相當常用的類型了。ECMAScript 數組的每一項可以保存任何類型的數據。且數組大小也能夠動態...
摘要:以上涉及到一個字符的轉換問題,這里不多擴展,寫一段代碼運行過程做筆記中國代表字符中的第一位,是只有長度的字符輸出字符長度為不確定時放入一個數組中。第一次運行后,返回值為,小于,所以的索引值未變化,。 Array.sort() 方法排序,默認為升序排序,如 1,2,3,4 這樣的排列,可以傳一個對比方法做為排序的參數,也可以不傳,則為按照字符的逐個 unicode 排序。 簡單默認排序 ...
摘要:的內置函數整理了一些語言精粹的方法一章的整理出的的內置方法之后還會整理標準入門的新添加的方法整理這些作用一方面是更好的理解記憶另一方面是對于類數組可以使用原型鏈的調用即可中的一些函數輸出的為的結果因此的作用是連接數組當然可以是數字也會加入到 Javascript的內置函數(ES5) 整理了一些Javascript語言精粹的方法一章的整理出的ES5的內置方法; 之后還會整理ES6標準入門...
閱讀 794·2021-11-12 10:36
閱讀 3373·2021-09-08 10:44
閱讀 2745·2019-08-30 11:08
閱讀 1402·2019-08-29 16:12
閱讀 2673·2019-08-29 12:24
閱讀 896·2019-08-26 10:14
閱讀 684·2019-08-23 18:32
閱讀 1173·2019-08-23 17:52