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)文章
第九篇Bootstrap導(dǎo)航菜單創(chuàng)建步驟詳解
這篇文章主要介紹了Bootstrap導(dǎo)航菜單創(chuàng)建步驟詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
純js實(shí)現(xiàn)無限空間大小的本地存儲(chǔ)
這篇文章主要介紹了純js實(shí)現(xiàn)無限空間大小的本地存儲(chǔ)的功能,源碼和demo都放給大家,本文著重說下實(shí)現(xiàn)的原理,具體的實(shí)踐擴(kuò)展小伙伴們自由發(fā)揮吧。2015-06-06
js時(shí)間戳和c#時(shí)間戳互轉(zhuǎn)方法(推薦)
下面小編就為大家?guī)硪黄猨s時(shí)間戳和c#時(shí)間戳互轉(zhuǎn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
JavaScript知識(shí)點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(hào)(==)和三個(gè)等于號(hào)(===)的區(qū)別
這篇文章主要介紹了JavaScript知識(shí)點(diǎn)總結(jié)(五)之Javascript中兩個(gè)等于號(hào)(==)和三個(gè)等于號(hào)(===)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-05-05
微信小程序調(diào)用wx.getImageInfo遇到的坑解決
這篇文章主要介紹了微信小程序調(diào)用wx.getImageInfo遇到的坑解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
關(guān)于better-scroll插件的無法滑動(dòng)bug(2021通過插件解決)
這篇文章主要介紹了關(guān)于better-scroll插件的無法滑動(dòng)bug(2021通過插件解決),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
微信小程序報(bào)錯(cuò): thirdScriptError的錯(cuò)誤問題
這篇文章主要介紹了微信小程序報(bào)錯(cuò): thirdScriptError,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
javascript系統(tǒng)時(shí)間設(shè)置操作示例
這篇文章主要介紹了javascript系統(tǒng)時(shí)間設(shè)置操作,涉及javascript時(shí)間運(yùn)算與判斷相關(guān)操作技巧,需要的朋友可以參考下2019-06-06
JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)事件畫筆
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)事件畫筆,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

