摘要:方法參數(shù)該有一個可選參數(shù),允許此方法幫助對內(nèi)容進行排序。例如,在非常大的數(shù)組中,可以使用新的方法來獲得更有效的排序函數(shù),而不是使用。在瀏覽器和節(jié)點中以全局對象的形式呈現(xiàn),并具有廣泛的支持包括。
英文原文: 《Usar correctamente el método sort()》
注意:內(nèi)容有做精簡和調(diào)整。
在過去的幾個星期里,我們在不同的團隊中看到,一般來說都沒有使用 Array.prototype.sort() 的習(xí)慣,并且不知道這種方法是如何工作的。今天我們將嘗試簡要描述它是如何工作的 .sort(),揭示它的一些秘密。
1. 修改原數(shù)組在這種情況下,我們必須記住,此方法通過對數(shù)組進行排序來修改數(shù)組,返回相同的有序數(shù)組,但不返回新數(shù)組。如果我們想要保持?jǐn)?shù)組不可變并獲得另一個排序,這一點很重要,我們必須在排序之前制作數(shù)組的拷貝。
2. 字符串在 Unicode 代碼中的位置比較默認(rèn)情況下,.sort() 方法會根據(jù) Unicode 代碼中每個字母的位置將數(shù)組值排序為字符串,因此您可以對此數(shù)組進行排序而不會出現(xiàn)問題:
console.log(["Zaragoza", "Madrid", "Barcelona"].sort()); // [ "Barcelona", "Madrid", "Zaragoza" ]
這似乎是正確的,但是如果和一些名稱以小寫字母開頭,那么排序似乎不正確:
console.log(["Zaragoza", "madrid", "Barcelona"].sort()); // [ "Barcelona", "Zaragoza", "madrid" ]
在這種情況下,排序是在 Unicode 代碼表中的每個字母的位置之后完成的,并且 m 落后 Z ,因此它已經(jīng)以這種方式排序。
如果我們想對數(shù)字排序,事情就會變得復(fù)雜起來:
console.log([80, 9, 100].sort()); // [ 100, 80, 9 ]
結(jié)果似乎很荒謬,但這是有道理的,發(fā)生的事情是數(shù)字已被轉(zhuǎn)換為字符串,因此被比較的是字符串"100","80"并且"9"。由于它們在 Unicode 代碼中的位置是按順序的,因此排序是正確的,即使它不是我們最初的預(yù)期。
這些情況的產(chǎn)生導(dǎo)致一些人放棄使用 .sort() 產(chǎn)生混亂的行為。這有點草率,因為只需一點幫助,這種方法可以毫無問題地運行。
3. Sort() 方法參數(shù)該 .sort() 有一個可選參數(shù),允許此方法幫助對內(nèi)容進行排序。這是此方法的關(guān)鍵,因為我們對每種情況都感興趣。
此函數(shù)接收兩個要比較的值,因此也會有這么三種情況:
如果第一個值大于第二個值,則返回正值 (1);
如果第一個值小于第二個值,則返回負(fù)值 (-1);
如果兩個值相等或等效于排序,則返回零值 (0);
這個函數(shù)由 Javascript 調(diào)用,只要您需要對數(shù)組中的元素進行排序,我們就可以進行必要的比較和調(diào)整。例如,為了比較數(shù)字,我們可以使用類似方法:
console.log([80, 9, 100].sort((a, b) => a - b)); // [ 9, 80, 100 ]
另外,(a, b) => a – b 還可以這么使用:使用其中一個值 a 去判斷是否大于另一個值 b 來返回排序結(jié)果:
const data = [ "Zaragoza", "madrid", "Barcelona" ]; data.sort ((a, b) => a.toLowerCase () > b.toLowerCase ()); console.log (data); // [ "Zaragoza", "madrid", "Barcelona" ]
顯然結(jié)果不正確,因為我們草率的將函數(shù)比較的結(jié)果 true 或者 false 返回,我們必須記住支持函數(shù) .sort() 希望我們返回 -1 , 1 或者 0。為了使它正常運行,我們必須做修改:
const data = [ "Zaragoza", "madrid", "Barcelona" ]; data.sort ((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : a.toLowerCase() < b.toLowerCase() ? -1: 0 ); console.log (data); // [ "Barcelona", "madrid", "Zaragoza" ]
現(xiàn)在的結(jié)果是我們需要的,因為我們已經(jīng)對小寫和大寫也進行了比較,并且我們已經(jīng)返回-1,1或者0根據(jù)每種情況。
我們還沒有真正完成,因為如果我們加入一些重音字母,我們會得到一個不希望的結(jié)果:
const data = [ "Zaragoza", "madrid", "Barcelona", "ávila" ]; data.sort ((a, b) => a.toLowerCase() > b.toLowerCase() ? 1 : a.toLowerCase() < b.toLowerCase() ? -1: 0 ); console.log (data); // [ "Barcelona", "madrid", "Zaragoza", "ávila" ]
當(dāng)我們想對文本字符串進行排序,就非常有必要使用 .localeCompare() 方法,也是非常重要。
4. 用對象屬性排序數(shù)組通常,如果數(shù)組包含對象,我們可以使用對象的屬性進行比較,例如:
const data = require ("./municipios.json"); data.sort ((a, b) => a.municipio.localeCompare (b.municipio));
我們可以對數(shù)據(jù)結(jié)構(gòu)中的日期和任何其他類型的對象執(zhí)行相同的操作。
5. 關(guān)于性能方面如果我們想對非常大的數(shù)組進行排序,我們必須記住。sort() 方法的支持函數(shù)將被多次調(diào)用,我們必須避免在這個函數(shù)中執(zhí)行許多操作或非常重的操作。我們必須盡可能有效地進行比較。
例如,在非常大的數(shù)組中,可以使用新的方法 Int.Collate().compare 來獲得更有效的排序函數(shù),而不是使用 .localecompare()。Int 對象是名為 International API ,也是 ECMA-402 的標(biāo)準(zhǔn)的一部分,
該標(biāo)準(zhǔn)側(cè)重于國際化功能,包括每種語言的正確排序。Int 在瀏覽器和節(jié)點中以全局對象的形式呈現(xiàn),并具有廣泛的支持(包括IE11)。
const data = [ "Zaragoza", "ávila", "madrid", "Barcelona" ]; const compare = new Intl.Collator ().compare; data.sort (compare); console.log (data); // [ "ávila", "Barcelona", "madrid", "Zaragoza" ]
排序操作很復(fù)雜,性能也很差,因此對于非常大的數(shù)組,排序方法支持函數(shù)速度的任何改進都將對性能產(chǎn)生非常顯著的影響。
6. 總結(jié)一般來說,我們應(yīng)該利用 .sort() 功能和一個支持函數(shù)來控制排序應(yīng)該如何執(zhí)行:
數(shù)字: (a, b) => a – b
鏈?zhǔn)剑?(a, b) => a.localeCompare(b)
在沒有函數(shù)參數(shù)的情況下使用 .sort() 是沒有意義的,也許在少數(shù)情況下是這樣,但是如果我們用一個簡單的函數(shù)支持它,那么 .sort 是一個非常有用的工具。
在許多情況下,排序是一個基本的操作,我們不應(yīng)該放棄在Javascript中進行這種排序。
關(guān)于我本文首發(fā)在 pingan8787個人博客,如需轉(zhuǎn)載請保留個人介紹。
Author | 王平安 |
---|---|
[email protected] | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推薦 | https://github.com/pingan8787... |
ES小冊 | js.pingan8787.com |
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/105975.html
摘要:它并不是實際在內(nèi)部的工作方式,而且它只是一個提案,在未來都會有可能發(fā)生變化。這意味著,數(shù)據(jù)的存儲是獨立于組件之外的。因此,有一個訣竅就是你需要思考作為一組需要一個匹配一致的指針去管理的數(shù)組染陌譯。 原文地址:https://medium.com/@ryardley/... 譯文:染陌 (Github) 譯文地址:https://github.com/answershuto/Blog 轉(zhuǎn)...
摘要:需求給出定兩個參數(shù),參數(shù),參數(shù)查找參數(shù)插入數(shù)組時的最小索引思路數(shù)組重排序判斷數(shù)組中是否包含的最小數(shù),有,則返回其最小數(shù)的索引無,則返回其數(shù)組長度思路用變量存儲大于中各元素的次數(shù)返回變量思路數(shù)組重排序查找大于的數(shù)組最小值的索引索引等于返 需求 給出定兩個參數(shù),參數(shù)1:arr,參數(shù)2:num;查找參數(shù)num插入數(shù)組時的最小索引 getIndexToIns([10, 20, 30, 40, ...
摘要:前言又稱提供一個全新的迭代器的概念,它允許我們在語言層面上定義一個有限或無限的序列。后者可以被用來幫助我們理解迭代器。但是當(dāng)我們使用迭代器時,這個問題就迎刃而解了。是中的新語法,用來配合迭代器。這是因為數(shù)組的迭代器只返回其中預(yù)期的元素。 前言 EcmaScript 2015 (又稱ES6)提供一個全新的迭代器的概念,它允許我們在語言層面上定義一個(有限或無限的)序列。 暫時先拋開它...
摘要:如果你使用實驗性屬性初始化語法,你能用這方法來正確綁定回調(diào)函數(shù)的綁定這語法在中默認(rèn)支持。然而,如果這回調(diào)函數(shù)是作為一個傳遞到更下一級的組件中的時候,些組件可能會做一個額外的重新渲染。 下面是react官方文檔的個人翻譯,如有翻譯錯誤,請多多指出原文地址:https://facebook.github.io/re... Handling events with React element...
閱讀 1669·2021-11-23 10:07
閱讀 2666·2019-08-30 11:10
閱讀 2850·2019-08-29 17:08
閱讀 1791·2019-08-29 15:42
閱讀 3188·2019-08-29 12:57
閱讀 2405·2019-08-28 18:06
閱讀 3554·2019-08-27 10:56
閱讀 394·2019-08-26 11:33