sort函數排序 時間排序


目錄

 

 

定義

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是同一對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM