我們提到數組排序都會想到數組的sort方法,這個方法用起來的確很方便,其原理還是用到了我們的冒泡排序,sort函數接受一個參數,參數為一個函數,如果不指定參數,則按照則按unicode碼順序排列。
var arr=[7,3,6,1,5,12]; console.log(arr.sort());//[1, 12, 3, 5, 6, 7] console.log(arr.sort(function(a,b){ return a-b; })); //[1, 3, 5, 6, 7, 12]
其實源碼實現也不是很難,首先我們要知道的這是數組上的一個方法,肯定是寫在數組構造函數的原型上,這樣所有的數組實例才能共享這個方法,首先傳入一個函數,根據函數的返回值來確定數組的順序。話不多說,直接上代碼
Array.prototype.customeSort = function (func) { var array = this;//保存this對象,這個指的是調用sort方法的數組對象 for (var i = 0; i < array.length - 1; i++) { for (j = 0; j < array.length - i - 1; j++) { //需要走雙層循環,一層循環只能確保最后一個元素是最大或者是最小,需要依次往前遍歷 var val = func(array[j], array[j + 1]); if (val > 0) {//通過函數返回值交換兩個數組元素 array[j] = array[j] + array[j + 1]; array[j + 1] = array[j] - array[j + 1]; array[j] = array[j] - array[j + 1]; } } } return array; }
這個時候一個簡單的sort方法已經基本上實現了,但是我們前面說過了,sort也有不傳入參數的情況,因為我們無法控制別人如何調用,這個時候func就報錯了 。
因為找不到這個函數,我們就需要判斷做一下處理,
Array.prototype.customeSort = function (func) { var array = this; if (func == undefined) {如果什么都傳,就比較他們的unicode碼 for (var i = 0; i < array.length - 1; i++) { for (j = 0; j < array.length - i - 1; j++) { var temp;//定義一個變量,用來暫時儲蓄臨時變量,給他們交換 if (String(array[j])>String(array[j + 1])) { temp= array[j + 1]; array[j+1]=array[j]; array[j]=temp; } } } } else if(typeof func=="function") {//如果傳入函數,就執行下面的代碼 for (var i = 0; i < array.length - 1; i++) { for (j = 0; j < array.length - i - 1; j++) { var val = func(array[j], array[j + 1]); if (val > 0) { array[j] = array[j] + array[j + 1]; array[j + 1] = array[j] - array[j + 1]; array[j] = array[j] - array[j + 1]; } } } } return array; }
現在一個完整的sort方法就基本上實現了,不足之處請大家指正。
無意中輸出了arr,發現arr也改變了,突然想到了數組是引用類型,我在內部保存了也沒啥卵用,他保存的是地址,所有一開始我們需要把傳進來的數組復制出來。這個時候就需要用到es6,不得不說es6真的很好用,現在很多招聘都直接要求熟悉es6了。
上最后的代碼
Array.prototype.customeSort = function (func) { var array = [...this];//復制出調用的arr對象,這樣后面我們修改的就是array對象,改變不了原數組 if (func == undefined) { for (var i = 0; i < array.length - 1; i++) { for (j = 0; j < array.length - i - 1; j++) { var temp=""; if (String(array[j])>String(array[j + 1])) { temp= array[j + 1]; array[j+1]=array[j]; array[j]=temp; } } } } else if(typeof func=="function") { for (var i = 0; i < array.length - 1; i++) { for (j = 0; j < array.length - i - 1; j++) { var val = func(array[j], array[j + 1]); if (val > 0) { array[j] = array[j] + array[j + 1]; array[j + 1] = array[j] - array[j + 1]; array[j] = array[j] - array[j + 1]; } } } } return array; }