JavaScript中好用的數(shù)組對(duì)象排序方法分享
在日常工作中,我們經(jīng)常需要對(duì)數(shù)組對(duì)象進(jìn)行排序。尤其是在處理數(shù)據(jù)可視化需求中,根據(jù)不同的數(shù)值維度進(jìn)行排序是必不可少的。本文將介紹一些簡(jiǎn)單而又實(shí)用的方法,幫助你實(shí)現(xiàn)對(duì)數(shù)組對(duì)象的某幾個(gè) key 進(jìn)行排序。
簡(jiǎn)單的排序方法
在最開始,我們先了解最基本的排序方法:sort()
。這是 JavaScript 原生的一個(gè)函數(shù),可以通過傳入一個(gè)比較函數(shù)來實(shí)現(xiàn)對(duì)數(shù)組對(duì)象的排序。比較函數(shù)接收兩個(gè)參數(shù) a 和 b,如果 a 應(yīng)該排在 b 的前面就返回負(fù)數(shù),如果 a 應(yīng)該排在 b 的后面就返回正數(shù),如果 a 和 b 的位置無所謂就返回 0。
// 按照 age 屬性進(jìn)行排序 const people = [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 30 } ]; people.sort((a, b) => a.age - b.age); console.log(people); /* Output: [ { name: 'Bob', age: 20 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 30 } ] */
這里的比較函數(shù) (a, b) => a.age - b.age
可以理解為“按照 age 升序排列”。如果想要按照降序排列,只需要將函數(shù)改為 (a, b) => b.age - a.age
即可。
實(shí)現(xiàn)多重排序
如果要按照多個(gè)屬性進(jìn)行排序,我們可以在比較函數(shù)中添加更多的邏輯。例如,假設(shè)我們想先按照 age 排序,然后按照 name 排序??梢赃@樣實(shí)現(xiàn):
// 按照 age 和 name 屬性進(jìn)行排序 const people = [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 30 }, { name: 'Bob', age: 15 }, { name: 'Alice', age: 20 } ]; people.sort((a, b) => { if (a.age !== b.age) { return a.age - b.age; } else { return a.name.localeCompare(b.name); } }); console.log(people); /* Output: [ { name: 'Bob', age: 15 }, { name: 'Alice', age: 20 }, { name: 'Bob', age: 20 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 30 } ] */
這里的比較函數(shù)先判斷兩個(gè)元素的 age 屬性是否相同,如果不同就按照 age 排序;如果相同,再按照 name 排序。注意到這里用了 localCompare()
方法來對(duì)字符串進(jìn)行排序。
具有通用性的排序方法
上面的方法雖然簡(jiǎn)單易懂,但是當(dāng)我們需要對(duì)多個(gè)不同的數(shù)組進(jìn)行排序時(shí),每次都寫一個(gè)比較函數(shù)會(huì)顯得很麻煩。這時(shí)候,我們可以使用一個(gè)具有通用性的排序方法 sortBy()
。
sortBy()
方法接收兩個(gè)參數(shù):要排序的數(shù)組,以及一個(gè)包含排序規(guī)則的數(shù)組。排序規(guī)則數(shù)組中的每個(gè)元素表示一個(gè)排序規(guī)則,它本身就是一個(gè)由屬性名和排序方向組成的數(shù)組。
下面是一個(gè)簡(jiǎn)單的實(shí)現(xiàn):
/** * 對(duì)數(shù)組對(duì)象的指定屬性進(jìn)行排序 * @param {Array} arr 數(shù)組對(duì)象 * @param {Array} rules 排序規(guī)則,每個(gè)元素都是形如 ['key', 'asc'] 或者 ['key', 'desc'] 的數(shù)組 */ function sortBy(arr, rules) { return arr.sort((a, b) => { for (let i = 0; i < rules.length; i++) { const [key, direction] = rules[i]; const order = direction === 'desc' ? -1 : 1; if (a[key] < b[key]) { return -1 * order; } if (a[key] > b[key]) { return 1 * order; } } return 0; }); }
使用方法也很簡(jiǎn)單。假設(shè)我們有一個(gè)數(shù)組對(duì)象,每個(gè)對(duì)象都包含 name、age 和 score 三個(gè)屬性。我們想先按照 score 降序排列,然后按照 age 升序排列。只需要這樣調(diào)用:
const students = [ { name: 'Alice', age: 20, score: 90 }, { name: 'Bob', age: 25, score: 85 }, { name: 'Charlie', age: 22, score: 95 }, { name: 'David', age: 25, score: 85 } ]; const result = sortBy(students, [ ['score', 'desc'], ['age', 'asc'] ]); console.log(result); /* Output: [ { name: 'Charlie', age: 22, score: 95 }, { name: 'Bob', age: 25, score: 85 }, { name: 'David', age: 25, score: 85 }, { name: 'Alice', age: 20, score: 90 } ] */
sortBy()
方法可以輕松地實(shí)現(xiàn)多重排序,而且相對(duì)于每次寫比較函數(shù)更加方便。不僅如此,還可以擴(kuò)展到更復(fù)雜的排序需求中。例如,如果我們想按照年齡在 20 到 30 歲之間的學(xué)生先排列,然后再按照分?jǐn)?shù)排序,只需要傳入這樣的規(guī)則:
const result = sortBy(students, [ [(student) => student.age >= 20 && student.age <= 30, 'asc'], ['score', 'desc'] ]); console.log(result); /* Output: [ { name: 'Alice', age: 20, score: 90 }, { name: 'Charlie', age: 22, score: 95 }, { name: 'Bob', age: 25, score: 85 }, { name: 'David', age: 25, score: 85 } ] */
這里使用了一個(gè)匿名函數(shù) (student) => student.age >= 20 && student.age <= 30
,用于判斷當(dāng)前元素是否符合條件。如果符合條件就返回 true,否則返回 false。這個(gè)函數(shù)可以根據(jù)具體需求進(jìn)行修改。
使用 Lodash 庫(kù)
最后介紹一下 Lodash 庫(kù),它是一個(gè) JavaScript 實(shí)用工具庫(kù),提供了很多方便的數(shù)組操作方法,包括排序。如果你不介意引入一個(gè)外部庫(kù)的話,Lodash 是一個(gè)非常好用的選擇。
假設(shè)我們還是要對(duì)上面的學(xué)生數(shù)組進(jìn)行排序。使用 Lodash 可以這樣實(shí)現(xiàn):
import _ from 'lodash'; const sortedStudents = _.orderBy(students, ['score', 'age'], ['desc', 'asc']); console.log(sortedStudents); /* Output: [ { name: 'Charlie', age: 22, score: 95 }, { name: 'Bob', age: 25, score: 85 }, { name: 'David', age: 25, score: 85 }, { name: 'Alice', age: 20, score: 90 } ] */
這里的 orderBy()
方法接收三個(gè)參數(shù):要排序的數(shù)組,以及一個(gè)包含排序?qū)傩缘臄?shù)組和一個(gè)包含排序方向的數(shù)組。屬性數(shù)組中的元素表示按照哪些屬性進(jìn)行排序,而方向數(shù)組中的元素表示每個(gè)屬性對(duì)應(yīng)的排序方向。
如果要對(duì)多重屬性進(jìn)行不同的排序方向,可以這樣寫:
const sortedStudents = _.orderBy(students, [ (student) => student.age >= 20 && student.age <= 30, 'score' ], ['asc', 'desc']); console.log(sortedStudents); /* Output: [ { name: 'Alice', age: 20, score: 90 }, { name: 'Charlie', age: 22, score:95 }, { name: 'David', age: 25, score: 85 }, { name: 'Bob', age: 25, score: 85 } ] */
這里的第一個(gè)元素是一個(gè)函數(shù),用于判斷當(dāng)前元素是否符合條件。如果符合條件就返回 true,否則返回 false。
總的來說,Lodash 提供了非常方便的數(shù)組排序方法,通過引入 Lodash 可以大大簡(jiǎn)化我們的排序操作。
結(jié)論
實(shí)現(xiàn)對(duì)數(shù)組對(duì)象進(jìn)行排序并不是很復(fù)雜,但是有幾個(gè)需要注意的點(diǎn):
- 如果只需要對(duì)單個(gè)屬性進(jìn)行排序,可以使用 JavaScript 原生的
sort()
方法; - 如果需要對(duì)多個(gè)屬性進(jìn)行排序,可以在比較函數(shù)中添加更多邏輯或者使用一個(gè)通用的排序方法;
- 如果對(duì)多個(gè)數(shù)組進(jìn)行排序,可以考慮使用 Lodash 庫(kù)。
到此這篇關(guān)于JavaScript中好用的數(shù)組對(duì)象排序方法分享的文章就介紹到這了,更多相關(guān)JavaScript數(shù)組對(duì)象排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JS對(duì)象數(shù)組排序方法測(cè)試代碼示例
- JavaScript將對(duì)象數(shù)組按字母順序排序的方法詳解
- javascript中的Array對(duì)象(數(shù)組的合并、轉(zhuǎn)換、迭代、排序、堆棧)
- JS sort方法基于數(shù)組對(duì)象屬性值排序
- JS深入學(xué)習(xí)之?dāng)?shù)組對(duì)象排序操作示例
- js 根據(jù)對(duì)象數(shù)組中的屬性進(jìn)行排序?qū)崿F(xiàn)代碼
- JS實(shí)現(xiàn)給數(shù)組對(duì)象排序的方法分析
- JS實(shí)現(xiàn)根據(jù)數(shù)組對(duì)象的某一屬性排序操作示例
- js中的數(shù)組對(duì)象排序分析
- JS實(shí)現(xiàn)json對(duì)象數(shù)組按對(duì)象屬性排序操作示例
- JavaScripts數(shù)組里的對(duì)象排序的24個(gè)方法(最新整理收藏)
相關(guān)文章
使用純?cè)鶭S實(shí)現(xiàn)大文件分片上傳
前段時(shí)間在工作中接觸到了文件上傳的內(nèi)容,但業(yè)務(wù)中實(shí)現(xiàn)的功能比較簡(jiǎn)單,于是我想著能不能使用純?cè)姆绞綄?shí)現(xiàn)一個(gè)大文件的上傳DEMO,從而在本質(zhì)上學(xué)習(xí)大文件上傳的思路,本教程使用純?cè)膆tml+node.js實(shí)現(xiàn),需要的朋友可以參考下2024-06-06layui實(shí)現(xiàn)下拉框三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了layui實(shí)現(xiàn)下拉框三級(jí)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07用RadioButten或CheckBox實(shí)現(xiàn)div的顯示與隱藏
用RadioButten(或CheckBox)實(shí)現(xiàn)div的顯示與隱藏,當(dāng)選擇“女”時(shí),顯示“美女、才女”;當(dāng)選擇“男”時(shí)隱藏,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-09-09js實(shí)現(xiàn)響應(yīng)按鈕點(diǎn)擊彈出可拖拽的非模態(tài)對(duì)話框完整實(shí)例【測(cè)試可用】
這篇文章主要介紹了js實(shí)現(xiàn)響應(yīng)按鈕點(diǎn)擊彈出可拖拽的非模態(tài)對(duì)話框,結(jié)合完整實(shí)例形式分析了原生JavaScript實(shí)現(xiàn)的可拖拽非模態(tài)對(duì)話框?qū)崿F(xiàn)技巧與使用方法,需要的朋友可以參考下2023-04-04js獲取網(wǎng)頁可見區(qū)域、正文以及屏幕分辨率的高度
這篇文章主要介紹了js獲取網(wǎng)頁的各種高度,例如可見區(qū)域、正文以及屏幕分辨率的高度,需要的朋友可以參考下2014-05-05