目錄
-
sort定義
-
sort排序 和 for循環排序比較
定義
sort() 方法用於對數組的元素進行排序。
返回值
對數組的引用。請注意,數組在原數組上進行排序,不生成副本。
說明
如果調用該方法時沒有使用參數,將按字母順序對數組中的元素進行排序,說得更精確點,是按照字符編碼的順序進行排序。要實現這一點,首先應把數組的元素都轉換成字符串(如有必要),以便進行比較。
如果想按照其他標准進行排序,就需要提供比較函數,該函數要比較兩個值,然后返回一個用於說明這兩個值的相對順序的數字。比較函數應該具有兩個參數 a 和 b,其返回值如下:
- 若 a 小於 b,在排序后的數組中 a 應該出現在 b 之前,則返回一個小於 0 的值。
- 若 a 等於 b,則返回 0。
- 若 a 大於 b,則返回一個大於 0 的值。
首先,要理解sort()內部是利用遞歸進行冒泡排序的;
例如:
var arr = [1, 5, 4, 2];
sort()方法的比較邏輯為:
第一輪:1和5比,1和4比,1和2比
第二輪:5和4比,5和2比
第三輪:4和2比
示例
sort排序 和 for循環排序比較
示例1
sort
優點:速度快、計算資源消耗小
缺點:sort系列跟蹤對檢測依賴性強,在跟蹤過程中,若某個目標被檢測到加入跟蹤后,這個目標之后很多幀都沒有被檢測到,那么其位置更新將會迅速停滯不動導致跟丟,實際目標還在,只是長時間沒檢到而已。
(無論是sort還是之后的deep sort其位置跟蹤過程都是一個kalman濾波的過程)
//a在前為降序,b在前為升序
var list= [{name:"小妹",datetime: "2021-07-09"},{name:"小妹",datetime: "2021-03-09"},{name:"小妹",datetime: "2021-09-09"}] list.sort(function(a, b) { return new Date(a.datetime).getTime() - new Date(b.datetime).getTime() }); console.log(list)
//或者
// <為降序 >為升序
function sortDate(a,b){
return a.datetime < b.datetime ? 1 : -1
}
arr.sort(sortDate)
console.log(arr);
如圖:


for
優點:程序簡潔
條件判斷出現在For里面,意味着,即使我在dosomething()或dootherthing()這2個函數中改變了condition的值,For循環也能正確執行我的意圖,因為它在每次循環中都會重新檢測conditon的值並針對condition的值做不同動作,所謂以不變應萬變,這是難能可貴的.
缺點:多執行了N-1次邏輯判斷,並且打斷了循環“流水線”作業,使得編譯器不能對循環進行優化處理,降低了效率。
如果condition一直未曾改變,我們可憐的if必須每次循環都判斷一下condition的真假.犧牲了運行時效率.
var dataContent = [{ received: "2017-08-18 13:23:21", sex: "man", }, { received: "2017-03-18 19:23:21", sex: "woman", }, { received: "2015-08-18 13:23:21", sex: "man", }, { received: "2017-01-18 13:23:21", sex: "man", }, { received: "2017-03-18 13:23:21", sex: "woman", }, { received: "2013-08-18 13:23:21", sex: "man" }, { received: "2017-08-18 10:56:21", sex: "man", }, { received: "2017-02-18 13:23:21", sex: "man", }, ]; //正序 dataContent = ForwardRankingDate(dataContent, "received"); console.log(dataContent); //封裝的日期排序方法 function ForwardRankingDate(data, p) { for (i = 0; i < data.length - 1; i++) { for (j = 0; j < data.length - 1 - i; j++) { if (Date.parse(data[j][p]) > Date.parse(data[j + 1][p])) { var temp = data[j]; data[j] = data[j + 1]; data[j + 1] = temp; } } } return data; }
sort排序算法
因為Array的sort()方法默認把所有元素先轉換為String再排序,結果'10'排在了'2'的前面,因為字符'1'比字符'2'的ASCII碼小。
如果不知道sort()方法的默認排序規則,直接對數字排序,絕對栽進坑里!
幸運的是,sort()方法也是一個高階函數,它還可以接收一個比較函數來實現自定義的排序。
//要按數字大小排序,我們可以這么寫: var arr = [10, 20, 1, 2]; arr.sort(function (a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; });
// [1, 2, 10, 20] //如果要倒序排序,我們可以把大的數放前面: var arr = [10, 20, 1, 2]; arr.sort(function (a, b) { if (a < b) { return 1; } if (a > b) { return -1; } return 0; });
// [20, 10, 2, 1] //默認情況下,對字符串排序,是按照ASCII的大小比較的,現在,排序應該忽略大小寫,按照字母序排序。 //要實現這個算法,不必對現有代碼大加改動,只要我們能定義出忽略大小寫的比較算法就可以: var arr = ['Google', 'apple', 'Microsoft']; arr.sort(function (s1, s2) { x1 = s1.toUpperCase(); x2 = s2.toUpperCase(); if (x1 < x2) { return -1; } if (x1 > x2) { return 1; } return 0; });
// ['apple', 'Google', 'Microsoft'] //忽略大小寫來比較兩個字符串,實際上就是先把字符串都變成大寫(或者都變成小寫),再比較。 //sort()方法會直接對Array進行修改,它返回的結果仍是當前Array: var a1 = ['B', 'A', 'C']; var a2 = a1.sort(); a1; // ['A', 'B', 'C'] a2; // ['A', 'B', 'C'] a1 === a2; // true, a1和a2是同一對象
