/**
* 数组内元素比较
* @param {String} prop 排序属性
* @param {String} mode 排序方式,不传默认为升序,desc 为降序
* @param {Function} minor 次级的排序方法或随机数,如果有次级条件可传
*/
function compare(prop, mode, minor) {
return function (obj1, obj2) {
var val1 = obj1[prop];
var val2 = obj2[prop];
// 如果不能转换为数字,继续向次级方法比较属性值
if (isNaN(Number(val1)) || isNaN(Number(val2))) {
return (typeof(minor) == 'function') ? minor(obj1, obj2) : (minor || 0);
}
val1 = Number(val1);
val2 = Number(val2);
// 如果两个属性值相等,继续向次级方法比较属性值,如果最后都相等,就返回随机排序
if (val1 === val2) {
return (typeof(minor) == 'function') ? minor(obj1, obj2) : (minor || 0);
}
if (mode == 'desc') { //降序
return val1 < val2 ? 1 : -1;
} else { //升序
return val1 < val2 ? -1 : 1;
}
}
}
/**
* 随机种子伪随机 [解释](https://www.jb51.net/article/88848.htm)
* @param {Number} seed 随机种子
* @param {Number} max 随机数最大值
* @param {Number} min 随机数最小值
*/
function seededRandom(seed, max, min) {
seed = seed || 5;
max = max || 1;
min = min || 0;
const _seed = (seed * 9301 + 49297) % 233280;
var rnd = _seed / 233280.0;
return min + rnd * (max - min);
}
// 调用举例
// 获取0-1的伪随机数
var randomNum = seededRandom();
// 调用多条件排序
Array.sort(compare('speed', 'desc', compare('type', 'asc', compare('level', 'desc', compare('stars', 'desc', compare('grade', 'desc', randomNum - 0.5))))));
重写Math.random
网友评论