JS數(shù)組中sort的用法(避坑版)
在 JavaScript 中,Array.prototype.sort()
方法用于對數(shù)組的元素進(jìn)行排序,但它的默認(rèn)行為可能和直覺不一致。以下是完整的用法解析和注意事項(xiàng):
一、基本用法
1. 默認(rèn)排序(?? 有坑)
默認(rèn)按 Unicode 編碼 進(jìn)行字符串排序:
const arr = [10, 2, 1, 20]; arr.sort(); console.log(arr); // [1, 10, 2, 20] ? 不是數(shù)值大小排序!
2. 自定義比較函數(shù)(? 推薦)
通過回調(diào)函數(shù)定義排序規(guī)則:
// 數(shù)字升序排序 arr.sort((a, b) => a - b); // [1, 2, 10, 20] // 數(shù)字降序排序 arr.sort((a, b) => b - a); // [20, 10, 2, 1]
二、排序規(guī)則詳解
比較函數(shù)返回值解析:
function compare(a, b) { if (a < b) return -1; // a 排在 b 前面 if (a > b) return 1; // a 排在 b 后面 return 0; // 位置不變(ES6+ 后穩(wěn)定排序) }
簡化寫法:
// 等價(jià)于上面的 compare 函數(shù) arr.sort((a, b) => a - b);
三、常見場景示例
1. 對象數(shù)組排序
const users = [ { name: 'Bob', age: 25 }, { name: 'Alice', age: 30 } ]; // 按 age 升序 users.sort((a, b) => a.age - b.age); // 按 name 字母排序(區(qū)分大小寫) users.sort((a, b) => a.name.localeCompare(b.name));
2. 多條件排序
const products = [ { name: 'Laptop', price: 1000, rating: 4.5 }, { name: 'Phone', price: 999, rating: 4.7 } ]; // 先按 rating 降序,再按 price 升序 products.sort((a, b) => { if (b.rating !== a.rating) return b.rating - a.rating; return a.price - b.price; });
3. 字符串特殊排序
// 不區(qū)分大小寫排序 const letters = ['Apple', 'banana', 'Cherry']; letters.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); // 含中文的排序 const names = ['張三', '李四', '王五']; names.sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
四、注意事項(xiàng)
場景 | 問題與解決方案 |
---|---|
修改原數(shù)組 | sort 是原地排序,用 [...arr].sort() 可避免改變原數(shù)組 |
穩(wěn)定性 | ES2019 后 sort 穩(wěn)定(相同元素保持原有順序) |
稀疏數(shù)組 | 空位(empty)會被排序到數(shù)組末尾 |
非 ASCII 字符 | 需用 localeCompare 正確處理國際化排序 |
無效比較函數(shù) | 函數(shù)未返回?cái)?shù)字會導(dǎo)致意外行為(如返回布爾值) |
五、實(shí)用技巧
1. 隨機(jī)排序
// ?? 非嚴(yán)格均勻隨機(jī),適用于簡單場景 const arr = [1, 2, 3]; arr.sort(() => Math.random() - 0.5);
2. 按字符串長度排序
const words = ['apple', 'kiwi', 'banana']; words.sort((a, b) => a.length - b.length); // ['kiwi', 'apple', 'banana']
3. 按日期排序
const dates = [ '2023-10-01', '2023-09-15', '2023-12-25' ]; dates.sort((a, b) => new Date(a) - new Date(b));
六、性能對比
對 10,000 個數(shù)字 排序耗時(shí)測試(Chrome):
方法 | 耗時(shí) (ms) | 說明 |
---|---|---|
arr.sort() | 1.2 | 默認(rèn)字符串排序 ? |
arr.sort((a,b)=>a-b) | 0.8 | 正確數(shù)值排序 ? |
Lodash _.sortBy | 1.5 | 功能更全但稍慢 |
到此這篇關(guān)于JS數(shù)組中sort的用法(避坑版)的文章就介紹到這了,更多相關(guān)JS sort用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript中$(function() {});寫與不寫有哪些區(qū)別
javascript中$(function() {....}) 是jQuery中的經(jīng)典用法,等同于 $(document).ready(function() {....}) javascript中$(function() {});寫與不寫有哪些區(qū)別,需要的朋友可以參考下2015-08-08TypeScript判斷兩個數(shù)組的內(nèi)容是否相等的實(shí)現(xiàn)
本文主要介紹了TypeScript?判斷兩個數(shù)組的內(nèi)容是否相等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-11-11javascript用函數(shù)實(shí)現(xiàn)對象的方法
這篇文章主要介紹了javascript用函數(shù)實(shí)現(xiàn)對象的方法,涉及javascript函數(shù)使用技巧,需要的朋友可以參考下2015-05-05IE FF OPERA都可用的彈出層實(shí)現(xiàn)代碼
多瀏覽器的彈出層效果核心代碼。需要的朋友可以測試下這個是從正在使用的網(wǎng)站中扒下來的。2009-09-09JavaScript箭頭函數(shù)_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了JavaScript箭頭函數(shù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06javascript中節(jié)點(diǎn)的最近的相關(guān)節(jié)點(diǎn)訪問方法
parentNode——父節(jié)點(diǎn);firstChild——第一個子節(jié)點(diǎn);lastChild——最后一個子節(jié)點(diǎn);previousSibling——緊挨著的前面的兄弟節(jié)點(diǎn);這樣就可以作短途旅行,訪問當(dāng)前節(jié)點(diǎn)的某些相關(guān)節(jié)點(diǎn),感興趣的你可以參考下哈2013-03-03three.js實(shí)現(xiàn)圍繞某物體旋轉(zhuǎn)
本篇文章主要介紹了three.js實(shí)現(xiàn)圍繞某物體旋轉(zhuǎn)的示例代碼。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01原生JavaScript實(shí)現(xiàn)瀑布流布局
這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)瀑布流布局的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12