在一個算法題中看到了這個sort方法,方法原理有點模糊玉凯,沒辦法,來馬克一下联贩,加強下記憶吧漫仆。
一. 定義和用法
首先,sort方法是通過原地算法對數(shù)組進行排序的一個方法泪幌,返回一個新的數(shù)組盲厌,同時會修改原數(shù)組署照。
二. 默認無參數(shù)調(diào)用方式
如果sort方法不加參數(shù),直接調(diào)用吗浩,如:
var arr1 = [1, 3, 12, 54];
var arr2 = ['a', 'go', 'me', 'console']
arr1.sort();
arr2.sort();
console.log(arr1)//[1,12, 3, 54]
console.log(arr2)//["a", "console", "go", "me"]
此時是按照字符編碼的順序進行排序建芙。首先把數(shù)組的元素都轉(zhuǎn)換成字符串,再進行比較懂扼,然后返回排序后的數(shù)組禁荸。
三. 按照其他標(biāo)準(zhǔn)進行排序
默認的排序方法,結(jié)果是不可控的阀湿,字符編碼排序靠前的元素就會排在前邊赶熟,如果想按照自己的意愿進行排序,那就需要在調(diào)用sort方法時添加一個參數(shù)炕倘,來體現(xiàn)你的排序意愿。
1.參數(shù)介紹
什么參數(shù)能夠完美體現(xiàn)你的意愿翰撑,那就自然是一個函數(shù)了罩旋。
arr.sort(compareFunction);
function compareFunction(a, b){
//a:第一個用于比較的元素。
//b:第二個用于比較的元素眶诈。
return a - b
}
如果指明了 compareFunction 涨醋,那么數(shù)組會按照調(diào)用該函數(shù)的返回值排序。即 a 和 b 是兩個將要被比較的元素:
- 如果 compareFunction(a, b) 返回值小于 0 逝撬,那么 a 會被排列到 b 之前浴骂;
- 如果 compareFunction(a, b) 返回值等于 0 , a 和 b 的相對位置不變宪潮。備注: ECMAScript 標(biāo)準(zhǔn)并不保證這一行為溯警,而且也不是所有瀏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
- 如果 compareFunction(a, b) 返回值大于 0 狡相, b 會被排列到 a 之前梯轻。
注:compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結(jié)果,否則排序的結(jié)果將是不確定的尽棕。
2.操作精髓
看完介紹就會明白喳挑,排序的精髓就在于參數(shù)的返回值,那么根據(jù)自己的意愿控制這個參數(shù)函數(shù)的返回值滔悉,就可以自定義排序規(guī)則了伊诵。
return結(jié)果小于0,前后位置不動回官;return結(jié)果大于0曹宴,前后位置會交換
例1:
var arr = [12,5,43,26,195];
function fun(a, b){
return a - b
//a-b可以控制讓數(shù)組按照從小到大的排序
}
arr.sort(fun);
console.log(arr)// [5, 12, 26, 43, 195]
//以上也可以簡化寫成:
arr.sort((a,b)=>a-b);
以上的代碼就是可以通過返回a-b來達到按照大小排序的目的。還有比較復(fù)雜的需求歉提,數(shù)組中的元素是復(fù)雜結(jié)構(gòu)浙炼,也可以通過控制返回值來對數(shù)組進行排序份氧。
例2:
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic' },
{ name: 'Zeros', value: 37 }
];
items.sort(function (a, b) {
return (a.value - b.value)
});
例子2就是通過元素的value值的大小對數(shù)組元素進行排序
四.總結(jié)
想要按照自己的意愿對數(shù)組進行排序,通過判斷參數(shù)在不同的場景返回符合自己意愿的返回值就好了弯屈。