JavaScript sort 游戏内多个条件的数组排序

/**
 * 数组内元素比较  
 * @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

转载于:https://www.jianshu.com/p/8a0a2142a8c0

猜你喜欢

转载自blog.csdn.net/weixin_33811961/article/details/91114428