當(dāng)我們想將現(xiàn)有的數(shù)組打亂順序止状,有兩個(gè)方法:
1. Array.prototype.sort()
數(shù)組的sort()方法
用原地算法對(duì)數(shù)組的元素進(jìn)行排序郎哭,并返回?cái)?shù)組。默認(rèn)排序順序是在將元素轉(zhuǎn)換為字符串烧颖,然后比較它們的UTF-16代碼單元值序列時(shí)構(gòu)建的明肮。
var arr = [1,2,3,4,5,'hello','bye',6,8,'yes'];
arr.sort(function(){
return Math.random()-0.5
})
sort()方法如果指定了一個(gè)函數(shù),那么會(huì)按照這個(gè)函數(shù)的返回值來(lái)對(duì)數(shù)組進(jìn)行排序:
- 如果返回值大于0蛉艾,那么被比較的相鄰兩個(gè)數(shù)a和b钳踊,a會(huì)排到b的后面,
- 如果返回值等于0勿侯,那么a和b的位置不變
- 如果返回值小于0拓瞪,那么a會(huì)排到b的前面。
但是助琐,用sort()方法不能實(shí)現(xiàn)真正意義上的完全亂序(如何將一個(gè) JavaScript 數(shù)組打亂順序祭埂? - Lucas HC的回答 - 知乎),要實(shí)現(xiàn)完全亂序兵钮,需要用到 Fisher–Yates shuffle 洗牌算法蛆橡。
2. Fisher–Yates shuffle 洗牌算法
該方法就是每次在數(shù)組中隨機(jī)產(chǎn)生一個(gè)位置,依次將數(shù)組中的每一項(xiàng)與該次產(chǎn)生的隨機(jī)位置上的元素交換位置:
function shuffle(arr){
var l = arr.length
var index, temp
while(l>0){
index = Math.floor(Math.random()*l)
temp = arr[l-1]
arr[l-1] = arr[index]
arr[index] = temp
l--
}
return arr
}