摘要:發(fā)現(xiàn)的問題是字符串比較引起的。而在第二版的返回值是與,對應(yīng)的是和。字符串比較是一個(gè)一個(gè)字符進(jìn)行比較中方法的比較函數(shù)返回值正值,負(fù)值,的含義
前言
前幾天使用JavaScript中Array的sort排序字符串,發(fā)現(xiàn)排序不準(zhǔn)確,這里記一下。
第一版var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5"]; // 第一個(gè)版本 arr.sort(function(a, b) { return a > b; }) console.log(arr); // ["0", "1", "11", "11", "12", "123", "123", "2", "333", "5"] // 這里發(fā)現(xiàn)結(jié)果不對,預(yù)想的結(jié)果是 ["0", "1", "2", "5", "11", "11", "12", "123", "123", "333"]
那就找原因。發(fā)現(xiàn)的問題是字符串比較引起的。
在JavaScript中,字符串的比較,是字符按從左到右一一對應(yīng)比較的。如果兩個(gè)字符串第一個(gè)字符是一樣,就比較第二個(gè)字符,如果第二個(gè)相等,就比較第三個(gè),以此類推,直到比較出結(jié)果。
而單個(gè)字符間比較的規(guī)則,這是是比較他們的charCode的大小。
列如:
"a".charCodeAt(0) // 97 "b".charCodeAt(0) // 98 "a" > "b" // false第二版
明白了字符串比較的規(guī)則后, 就修改為下面的版本。
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "100"]; // 第二個(gè)版本 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } // isNaN 這個(gè)方法需要注意, 會隱式的進(jìn)行類型轉(zhuǎn), 需要注意 // isNaN(null) => false, isNaN(true) => false, isNaN([]) => false arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進(jìn)行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉(zhuǎn)換 return a - b; } return a > b; })第三版
字符里面全都是數(shù)字是沒有問題了,但是還需要考慮非純數(shù)字的情況
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; // 從小到大 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進(jìn)行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉(zhuǎn)換 return a - b; } return a > b; }) // 輸出結(jié)果 ["0", "1", "2", "5", "11", "11", "12", "123", "123", "1aa", "333", "aa"] 這個(gè)沒有問題的 // 從大到小 var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進(jìn)行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉(zhuǎn)換 return b - a; } return b > a; }) // 輸出結(jié)果 ["123", "1aa", "aa", "5", "2", "333", "123", "12", "11", "11", "1", "0"] 已經(jīng)是不符合期望
于是查找原因,發(fā)現(xiàn)原因是sort的比較方法的返回值不對。
如果想按照其他標(biāo)準(zhǔn)進(jìn)行排序,就需要提供比較函數(shù),該函數(shù)要比較兩個(gè)值,然后返回一個(gè)用于說明這兩個(gè)值的相對順序的數(shù)字。比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b,其返回值如下:
若 a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前,則返回一個(gè)小于 0 的值。
若 a 等于 b,則返回 0。
若 a 大于 b,則返回一個(gè)大于 0 的值。
而在第二版的返回值是true與false,對應(yīng)的是 1 和 0。于是修改為下面的版本
var arr = ["0", "1", "11", "11", "2", "12", "123", "123", "333", "5", "aa", "1aa"]; // 從大到小 var isNumber = function(str) { // 前面說了是字符串類型,所以這里沒有做類型判斷 return !isNaN(str); } arr.sort(function(a, b) { // 如果比較雙方都是number類型的字符,按照number進(jìn)行比較 if(isNumber(a) && isNumber(b)) { // 隱式轉(zhuǎn)換 return b - a; } return b === a ? 0 : b > a ? 1 : -1; }) // 輸出結(jié)果["aa", "333", "1aa", "123", "123", "12", "11", "11", "5", "2", "1", "0"]總結(jié)
在JS中字符串比較和sort進(jìn)行排序不經(jīng)常使用,使用的時(shí)候多測測。就能越過一些不必要的坑。
字符串比較是一個(gè)一個(gè)字符進(jìn)行比較 Array中sort方法的比較函數(shù)返回值正值,負(fù)值,0的含義文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107653.html
摘要:事件的響應(yīng)分區(qū)為三個(gè)階段捕獲目標(biāo)冒泡階段。綁定的多個(gè)事件會被覆蓋,后者覆蓋前者。再用轉(zhuǎn)換成數(shù)值表示。如實(shí)際數(shù)量為,則展示為項(xiàng)目中使用過濾器做的處理可以抽取方法的,調(diào)整相關(guān),可以獲取指定位數(shù)的縮寫。 CSS html5中a的download屬性 定義和用法download 屬性定義下載鏈接的地址或指定下載文件的名稱。文件名稱沒有限定值,瀏覽器會自動在文件名稱末尾添加該下載文件的后綴 (...
摘要:事件的響應(yīng)分區(qū)為三個(gè)階段捕獲目標(biāo)冒泡階段。綁定的多個(gè)事件會被覆蓋,后者覆蓋前者。再用轉(zhuǎn)換成數(shù)值表示。如實(shí)際數(shù)量為,則展示為項(xiàng)目中使用過濾器做的處理可以抽取方法的,調(diào)整相關(guān),可以獲取指定位數(shù)的縮寫。 CSS html5中a的download屬性 定義和用法download 屬性定義下載鏈接的地址或指定下載文件的名稱。文件名稱沒有限定值,瀏覽器會自動在文件名稱末尾添加該下載文件的后綴 (...
摘要:希爾排序希爾排序這個(gè)名字,來源于它的發(fā)明者希爾,也稱作縮小增量排序,是插入排序的一種更高效的改進(jìn)版本。我們可以發(fā)現(xiàn),當(dāng)區(qū)間為的時(shí)候,它使用的排序方式就是插入排序。 冒泡排序 冒泡排序無疑是最為出名的排序算法之一,從序列的一端開始往另一端冒泡(你可以從左往右冒泡,也可以從右往左冒泡,看心情),依次比較相鄰的兩個(gè)數(shù)的大小(到底是比大還是比小也看你心情)。 showImg(https://s...
摘要:我們討論比較排序算法的理論基礎(chǔ),并結(jié)合本章應(yīng)用排序和優(yōu)先級隊(duì)列算法。基本排序引入了選擇排序,插入排序和。描述了,一種保證在線性時(shí)間內(nèi)運(yùn)行的排序算法。當(dāng)我們后續(xù)實(shí)現(xiàn)排序算法時(shí),我們實(shí)際上將這個(gè)機(jī)制隱藏在我們的實(shí)現(xiàn)下面。 前言 上一篇:棧和隊(duì)列下一篇:歸并排序 排序是重新排列一系列對象以便按照某種邏輯順序排列的過程。排序在商業(yè)數(shù)據(jù)處理和現(xiàn)代科學(xué)計(jì)算中起著重要作用。在交易處理,組合優(yōu)化,天體...
閱讀 1216·2021-11-22 12:05
閱讀 1343·2021-09-29 09:35
閱讀 640·2019-08-30 15:55
閱讀 3133·2019-08-30 14:12
閱讀 960·2019-08-30 14:11
閱讀 2881·2019-08-30 13:10
閱讀 2406·2019-08-29 16:33
閱讀 3335·2019-08-29 11:02