有時,我們需要將一個數(shù)組內的元素順序進行打亂书聚,達到隨機排序的目的唧领。首先想到的是 Math.random()
方法結合數(shù)組的 sort()
方法。
Math.random() 結合 sort() 方法
Math.random()
方法用于產(chǎn)生一個介于 0 和 1 之間的隨機數(shù)(含 0 但不包括 1)雌续。
數(shù)組的 sort()
方法可以有兩種用法:
用法一:在不傳入可選的函數(shù)參數(shù)時斩个,將會對數(shù)組的每一個元素應用 toString()
方法,通過比較字符串大小的方式升序排列所有的數(shù)組項驯杜。
用法二:編寫比較函數(shù)并作為參數(shù)傳入受啥,假設有以下比較函數(shù)(補充一點關于下面參數(shù) a、b 的說明鸽心,若 a 為數(shù)組的第一個元素滚局,則 b 為第二個元素,依次類推……)顽频,
function compare (a, b) {
// 省略一些代碼……
return val;
}
如果你想將 a 變量排列在變量 b 的前面位置藤肢,則比較函數(shù)返回負數(shù)(即上述 val 為負數(shù));若想將 a 變量排列在變量 b 的后面糯景,則返回正數(shù)(即上述 val 為正數(shù))嘁圈;若不需要改變 a、b 變量之間的順序莺奸,則返回 0(即上述 val 為 0)丑孩。
因此有了以下代碼:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr.sort(function (a, b) {
return Math.random() - 0.5;
});
console.log(arr);
洗牌算法
上述方法比較簡單,且代碼量少灭贷,短小精悍温学。這里我再講一種比上面復雜一些的洗牌算法,通過它也能達到數(shù)組隨機排序的效果甚疟。那下面就開講啦~
首先是要明白它的洗牌原理仗岖,該算法需要遍歷整個數(shù)組,當遍歷到第 i(i 為數(shù)組元素的索引)個元素時览妖,從 0 到 i 隨機挑選出一個數(shù)字轧拄,記為 index,然后對索引為 i 和 index 的數(shù)組元素進行互換讽膏,直至遍歷結束檩电。如此下來,也即完成了數(shù)組的隨機排序。來看下代碼吧:
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
function shuffle (arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
// 生成 0 到 i 之間的隨機整數(shù)
var index = Math.floor(Math.random() * (i + 1));
// 使用 ES6 中的解構賦值完成兩個變量值的交換
[arr[i], arr[index]] = [arr[index], arr[i]];
}
return arr;
}
console.log('Shuffled arr: ', shuffle(arr));
以上就是我目前想到的兩種方法俐末,在這里分享給大家料按,若有不足之處,請予以指出卓箫,感謝载矿!