美文网首页
JavaScript sort 游戏内多个条件的数组排序

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

作者: IvanRunning | 来源:发表于2019-06-06 09:21 被阅读0次
    /**
     * 数组内元素比较  
     * @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

    相关文章

      网友评论

          本文标题:JavaScript sort 游戏内多个条件的数组排序

          本文链接:https://www.haomeiwen.com/subject/kscyxctx.html