詳解 JS 的 sort() 排序
前言
sort() 排序在實際專案中是經常用到的。剛專案中遇到比較複雜資料的排序,寫點東西,記一下心得。
心得
1. sort() 預設是升序,排序會修改原資料,也會返回一個新陣列。
2. sort() 排序底層是按照 ASCII 碼大小(MDN 上寫著是按照 Unicode 碼)來排序的,sort 底層自動會進行迴圈比較。
3. 也可以在 sort() 方法裡傳入比較器函式自定義比較規則。
Examples:arr.sort((a,b) => { //內部只要寫比較 a,b 的程式碼邏輯就可以了。 //可以用 return 1 來交換2個元素位置,return -1 不做交換。 })
1. 純數字陣列,純數字字串陣列或組合陣列排序
const arr = [9,43,22,100]; //或 ['9','43','22','100']
let newArr = arr.sort();
console.log(newArr) //[100, 22, 43, 9]
純數字陣列,純數字字串陣列或組合不傳比較器直接用 sort() 排序,是按照元素的第一位的大小進行排序的,並不是我們想要的結果。
如果想要按數字大小排列就得傳入比較器函式。
const arr = [91,42,61,22]; let newArr = arr.sort((a,b) => { return a-b; //升序 // return b-a; //倒序 // return Math.random()>.5 ? -1 : 1; //亂序 }); console.log(newArr)
2. 由字母和數字字串組成的陣列排序
字串排序,sort() 會先對字串的第一位的 Unicode 碼進行對比,如果一樣依次比較第二位,第三位...
升序直接使用 sort() 方法就行
const arr = ["a","d","fa","5","t","fw2","a31","b","e","2fs","4","0",'z9z','z6n','ng','af','7a']
let newArr = arr.sort();
console.log(newArr)
傳入比較器函式可以按降序排列
const arr = ["a","d","fa","5","t","fw2","b","e","2fs","4",'z9z','z6n','af','7a']; let newArr = arr.sort((a,b) => { if (a < b) { return -1; } if (a > b) { return 1; } return 0; }); console.log(newArr) //["2fs", "4", "5", "7a", "a", "af", "b", "d", "e", "fa", "fw2", "t", "z6n", "z9z"]
字串比大小 < >,是按照字串的 Unicode 碼大小進行比較的。
這是網上找的一個例子,把數字的排序放到字母后面
function mySorter(a, b){
if (/^\d/.test(a) ^ /^\D/.test(b)) return a>b?1:(a==b?0:-1); //^是位運算,左右兩邊不相等返回1,相等返回0
return a>b?-1:(a==b?0:1);
}
const pyArray=["a","d","fa","5","t","fw2","a31","b","e","2fs","4","0"]
console.log((pyArray.sort(mySorter)))
3. 漢語按照拼音首字母排序
a.localeCompare(b [, locales [, options]]) 方法會按照當地的規則,採用底層作業系統提供的排序規則進行比較。返回一個數字,a 在 b 之前返回負數,a 在 b 之後返回正數,相等返回0。可以用此方法給漢語排序。
相容 IE11。
const arr = ['中國','紅火','大爺','大大','阿里'];
let newArr = arr.sort((a,b) => {
return a.localeCompare(b, 'zh-Hans-CN', {sensitivity: 'accent'});
});
console.log(newArr) //["阿里", "大大", "大爺", "紅火", "中國"]
4. 數字字串、字母、漢語和標點混合字串陣列排序
這裡的字串是包含標點,數字字串,大小寫字母,漢字混合型別的字串。
const rooms = [
{name: "-100"},
{name: "1-00"},
{name: "111"},
{name: "103"},
{name: "101"},
{name: "%202"},
{name: "?"},
{name: "1?"},
{name: "%3"},
{name: "@"},
{name: "Z"},
{name: "D"},
{name: "y"},
{name: "d"},
{name: "是"},
{name: "啊"},
{name: "201他"},
];
rooms.sort(locale);
console.log(rooms);
function locale(a, b) {
return a.name.localeCompare(b.name, 'zh-Hans-CN', {sensitivity: 'variant'});
}
這種方法排出的預設順序是:符號,數字0-9,漢字,小寫在前大寫在後字母Aa-Zz。
自定義的排序順序:空字串,數字,大寫,小寫,漢字,標點及特殊字元。
(感覺應該還有很多可以優化的地方):
//空-1,數字字母1,漢字2,符號3
const standard = /[a-zA-Z0-9]/; //1
const hanzi = /[\u4e00-\u9fa5]/; //2
const rooms = [
{name: "-100"},
{name: "1-00"},
{name: "111"},
{name: "103"},
{name: "101"},
{name: "?"},
{name: "1?"},
{name: "%3"},
{name: "@"},
{name: "Z"},
{name: "大"},
{name: "D"},
{name: "y"},
{name: "d"},
{name: "是"},
{name: "啊"},
{name: "201他"},
{name: "201按"},
];
rooms.sort(sortFunc);
console.log(rooms);
function sortFunc(a, b) {
a = a.name;
b = b.name;
let max = a.length;
if(b.length > max) {
max = b.length;
}
for(let i=0; i<max; i++) {
if(type(a[i]) > type(b[i])) {
return 1;
}else if(type(a[i]) === type(b[i])){
if(a[i] !== b[i]) {
if(type(a[i]) === 1 || type(a[i]) === 3) {
if(a[i] > b[i]) {
return 1;
}else if(a[i] < b[i]) {
return -1;
}
}else if(type(a[i]) === 2) {
return a[i].localeCompare(b[i], 'zh-Hans-CN', {sensitivity: 'accent'})
}
}
}else {
return -1;
}
}
}
//判斷當前位的字串的型別
function type (str) {
let n;
if(!str) {
n = -1;
}else if(standard.test(str)) {
n = 1;
}else if(hanzi.test(str)) {
n = 2;
}else {
n = 3;
}
return n;
}
有不足的地方歡迎大家評論。相關推薦
圖文詳解JS氣泡排序,看完秒懂!
以[23,9,78,6,45]為例,用氣泡排序法從小到大排列: function bubbleSort(){ var array = [23,9,78,6,45]; cons
詳解 JS 的 sort() 排序
前言 sort() 排序在實際專案中是經常用到的。剛專案中遇到比較複雜資料的排序,寫點東西,記一下心得。 心得 1. sort() 預設是升序,排序會修改原資料,也會返回一個新陣列。 2. sort() 排序底層是按照 A
詳解js跨域
-name tor adding code 填充 父域 allow mes document 什麽是跨域? 概念:只要協議、域名、端口有任何一個不同,都被當作是不同的域。 對於端口和協議的不同,只能通過後臺來解決。URL 說明
詳解JavaScript冒泡排序
-s text 通過 最小值 每一個 圖片 數組 技術分享 感謝 相信接觸過編程語言的同學們都會對冒泡排序不陌生,今天我為大家分享一下冒泡排序的一些實現等等 註:冒泡排序為我個人理解如若有不同意見的同學歡迎討論 首先介紹一下樓主的思路: 假如現在有以下一個數組 樓主的
詳解js正則表達式語法介紹
技術 invalid 我想 不同 小結 小括號 字符 rip 空字符串 1. 正則表達式規則 1.1 普通字符 字母、數字、漢字、下劃線、以及後邊章節中沒有特殊定義的標點符號,都是"普通字符"。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。
詳解JS資料型別轉換
資料型別分類 基本資料型別 Number | String | Boolean | Null | Undefined | Symbol 複合資料型別 Object 資料型別轉換 1. 顯示型別轉換 Number() | String() | Boo
例項詳解js閉包(一)閉包基本概念及其作用推導
在學習前端的過程中,不可避免的要學習到js閉包這個知識點,很多朋友感到對閉包很難理解,也不清楚它有什麼用。本文就詳細介紹一下閉包,並通過幾個小例子來說明下閉包的用處。 一、閉包的概念 閉包的英文單詞是Closure,我先給閉包可
ROW_NUMBER() OVER()函式用法詳解 (分組排序 例子多)
語法格式:row_number() over(partition by 分組列 order by 排序列 desc) row_number() over()分組排序功能: 在使用 row_number() over()函式時候,over()裡頭的分組以及排序的執行晚於 wher
幾種排序方法詳解(選擇排序、氣泡排序、插入排序、快速排序)
由於本帖只是闡述幾種排序方法的原理、如何區分以及編寫幾種排序的簡單程式碼,所以直接給定陣列是 a[ ]={6,2,8,5,1},需要把以上5個數字按升序排列 1. 選擇排序法 (如果不想看解釋分析,直接往後拉看程式碼) 實質: 第一輪:通過對比陣列中前一個元素和後一個元素
詳解js原型,建構函式以及class之間的原型關係
原型 概念 在建構函式建立的時候,系統預設的幫建構函式建立並關聯一個物件 這個物件就是原型 作用 在原型中的所有屬性和方法,都可以被和其關聯的建構函式創建出來的所有的物件共享 訪問原型 建構函式名.prototype 例項化的物件.__proto __ 原型的簡單使
js sort排序
這個是sort方法裡的那個比較函式的特殊的返回值,比較函式的引數 a 和 b 代表數組裡的兩個元素,如果 a 小於 b,排序後的陣列 a 在 b 前面,此時返回一個負數 (即上面的 return -1)如果 a 等於 b,排序後兩者位置不變,此時返回 0 (即上面的 return 0)如果 a 大於 b,排序
詳解JS中promise化微信小程式api
這篇文章主要給大家通過程式碼例項分析了promise化微信小程式api的使用方法,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 promise化的原因 微信小程式的api用的是物件引數回撥模式,很容易造成回撥地獄,程式碼難以閱讀,判斷,修改 和除錯. 微信小程式api示例 // 獲取使用者資
詳解JS正則replace的使用方法
詳解JS正則replace的使用方法 原文地址:http://www.jb51.net/article/80544.htm 在講replace的高階應用之前,我們先簡單梳理一下JS正則中的幾個重要的知識點,以幫助你對基礎知識的回顧,然後再講解JS正則表示式在re
詳解JS獲取HTML DOM元素的8種方法
詳解JS獲取HTML DOM元素的8種方法 什麼是HTML DOM 文件物件模型(Document Object Model),是W3C組織推薦的處理可擴充套件置標語言的標準程式設計介面。簡單理解就是HTML DOM 是關於如何獲取、修改、新增或刪除 HTML 元素的標準。我們用Ja
this應用詳解-js原生
學習記錄,以防遺忘,適合新手解惑。老鳥避讓! 在微信H5的開發中,很多頁面都是簡單的一個模型item在加上很多很多資料組成起來的。例如微信朋友圈,仔細觀察,他的一個基本模型就是 “頭像圖片 + 使用者暱稱 + 一段文字 + 一張或大於一張小於九張的圖片 + startTime ”。總
詳解js中的閉包
前言 在js中,閉包是一個很重要又相當不容易完全理解的要點,網上關於講解閉包的文章非常多,但是並不是非常容易讀懂,在這裡以《javascript高階程式設計》裡面的理論為基礎。用拆分的方式,深入講解一下對於閉包的理解,如果有不對請指正。 寫在閉包之前 閉包的內部
詳解JS中的基本資料型別和引用資料型別
ECMAScript變數可能包含兩種不同型別的值:基本型別值和引用型別值。基本型別值指的是簡單的資料段,而引用型別值指那些可能由多個值構成的物件。 在將一個值賦值給變數時,解析器必須確定這個值是基本型別值還是引用型別值 js的六大資料型別:Number, String,
例項詳解js實現登入與註冊介面
本文主要為大家詳細介紹了js實現登入與註冊介面,具有一定的參考價值,感興趣的小夥伴們可以參考一下,希望能幫助到大家。 完成登入與註冊頁面的HTML+CSS+JS,其中的輸入項檢查包括: 使用者名稱6-12位 首字母不能是數字 只能包含字母和數字
詳解二叉排序樹
二叉排序樹的插入、查詢、刪除 二叉排序樹的定義 二叉排序樹右稱二叉查詢樹。或者為空樹,或者是具有以下性質: (1)若它的左子樹不為空,則左子樹所有節點的值小於根結點, (2)若它的右子樹不為空,則根結點的值小於所有右子樹結點的值 (3)它的左右子樹葉分別為二叉排序樹 總結
詳解js深淺複製
文章轉自:https://segmentfault.com/a/1190000008838101 作者寫的很好! 贊 ! 前言 在之前寫繼承的過程談到了深淺複製的問題,因為有讀者反映到需要解析,趁今天週末寫一篇解析,今天的主體相對之前來說理解難度低一些,篇幅可能也比較短,諸君按需閱讀即可