Vue 內(nèi)置的內(nèi)容篩選器 sort 可以在數(shù)組上排序并返回排序后的新數(shù)組。它可以接受一個比較函數(shù)作為參數(shù),該函數(shù)將比較兩個值并返回一個表示它們之間關(guān)系的數(shù)字。sort 的默認(rèn)行為是將元素轉(zhuǎn)換為字符串并按照 Unicode 代碼點(diǎn)排序。
// 簡單示例 var arr = [1, 3, 2]; arr.sort(); // [1, 2, 3] // 比較函數(shù)示例 arr.sort(function(a, b) { return a - b; }); // [1, 2, 3] arr.sort(function(a, b) { return b - a; }); // [3, 2, 1]
sort 函數(shù)的比較函數(shù)應(yīng)該接受兩個參數(shù) a 和 b,并根據(jù)它們的關(guān)系返回一個負(fù)數(shù)、零或正數(shù)。如果 a 應(yīng)該排在 b 之前,則返回負(fù)數(shù)。如果 a 和 b 相等,則返回零。如果 a 應(yīng)該排在 b 之后,則返回正數(shù)。這個比較函數(shù)應(yīng)該是一個純函數(shù),不會修改傳入的參數(shù)。
sort 的時間復(fù)雜度是 O(n log n),因此它適用于排序較小的數(shù)組或者只需要排序一次的場景。如果需要對數(shù)組進(jìn)行多次排序或者是需要快速查詢某一個鍵值對,更適合使用 Map 或者 Set 這樣的數(shù)據(jù)結(jié)構(gòu)。
sort 可以更加靈活的用于對象數(shù)組的排序。在這種情況下,比較函數(shù)可以根據(jù)對象的某一個屬性進(jìn)行排序,可以按照升序或者降序排列。例如,如果有一個表示學(xué)生信息的數(shù)組,該數(shù)組包含每個學(xué)生的姓名和分?jǐn)?shù),我們可以按照分?jǐn)?shù)進(jìn)行排序:
var students = [ { name: 'Lucy', score: 90 }, { name: 'Lily', score: 70 }, { name: 'Tom', score: 80 } ]; students.sort(function(a, b) { return a.score - b.score; });
以上代碼會將 students 數(shù)組按照學(xué)生的分?jǐn)?shù)升序排列。如果需要按照姓名進(jìn)行排序,可以將比較函數(shù)修改為:
students.sort(function(a, b) { if (a.name >b.name) { return 1; } else if (a.name< b.name) { return -1; } else { return 0; } });
sort 還有一個可選的第二個參數(shù),它可以用于指定排序算法。該參數(shù)可以是字符串或者函數(shù)。如果是字符串,sort 會使用對應(yīng)的算法進(jìn)行排序。可以指定以下字符串之一:'quicksort'、'mergesort'、'heapsort'
。如果是函數(shù),sort 將使用該函數(shù)作為排序算法。