js陣列根據不同的業務需求,會要求陣列有序或者無序,記錄一下流傳較廣,通用性較強的排序和亂序方法。
陣列排序:
arr.sort(function(a,b){//從小到大
return a-b;【return b-a;//從大到小】
});
亂序陣列:
arr.sort(function(a,b){//一般隨機
return Math.random() - 0.5;
});
先看用到的sort(),sort()方法會呼叫每個陣列項的 toString() 轉型方法,原理是基於字串(字元編碼)的比較排序。應用方式:arrayObject.sort(sortby)【sortby:排序方式,函式】,返回原陣列的引用,不生成副本。
排序函式的返回值決定位置:
若 sortby(a, b) < 0 ,return [a,b];
若 sortby(a, b) = 0 , return [a,b] or [b,a];
若 sortby(a, b) > 0 , return [b,a];
關於陣列打亂方法,在網上看到一個更搞笑的處理方法,Fisher–Yates shuffle 洗牌演算法
【https://gaohaoyang.github.io/2016/10/16/shuffle-algorithm/,詳細說明的地址】
if (!Array.prototype.shuffle) {
Array.prototype.shuffle = function() {
for(var i = this.length-1;i>=0;i--){
var index = Math.floor(Math.random()*(i+1));//重點就是隨機下標
var arrItem = this[index];
this[index] = this[i];
this[i] = arrItem;
}
return this;
};
}
arr.shuffle();
還有一種不太友好的寫法
if (!Array.prototype.shuffle) {
Array.prototype.shuffle = function() {
for(var j, x, i = this.length; i; j = parseInt(Math.random() * i), x = this[--i], this[i] = this[j], this[j] = x);
return this;
};
}
arr.shuffle();