• 巧用对象,生成不重复随机数


    有时候我们需要在一定范围内生成一组不重复的随机数组,我们可能会这样做:

    //需求:在一个已知的数组中,随机选取一部分组成新的数据,要求数组元素不重复出现:
        //常规实现
        var arr = [3,5,30,20,21,50,80,6,8,10,15]
        //去重一下,不去重,可能造成死循环
        arr = arr.filter(function(element,index,self){
            return self.indexOf(element) === index;
        });
        var getArr = function (len) {
            var tempArr = []
            var mathIndex
            var arrLen = arr.length
            var arrItem
            var falg
            if(len > arrLen){
                console.log('无法获取指定长度的数组!')
                return
            }
            while (tempArr.length < len){
                falg = false
                //向下取整,得到0-(arrLen - 1)的整数
                mathIndex = Math.floor(Math.random() * arrLen)
                arrItem = arr[mathIndex]
                //判断是否存在,存在即重新生成,不存在则push
                for(var i = 0 ; i < tempArr.length ; i++){
                    if(tempArr[i] === arrItem){
                        falg = true
                        break;
                    }
                }
                //不存在
                if(!falg){
                    tempArr.push(arrItem)
                }
            }
            return tempArr
        }
        getArr(5)
        getArr(6)
        getArr(11)
    

    运行截图:
    运行截图

    可以看到,这样实现的方式篇幅比较长,中间主要是由于要判断是否有重复数组做了大量处理,我们换一个种方式来实现。

    var arr = [3,5,30,20,21,50,80,6,8,10,15]
        //去重一下,不去重,可能造成死循环
        arr = arr.filter(function(element,index,self){
            return self.indexOf(element) === index;
        });
    // 对象替换数组的方式实现:
        var getMyArr = function (len) {
            var tempArr = []
            var mathIndex
            var arrLen = arr.length
            var arrItem
            var arrIndexMap = {}
            if(len > arrLen){
                console.log('无法获取指定长度的数组!')
                return
            }
            while (tempArr.length < len){
                //向下取整,得到0-(arrLen - 1)的整数
                mathIndex = Math.floor(Math.random() * arrLen)
                arrItem = arr[mathIndex]
                //判断是否重复
                if(!arrIndexMap[mathIndex]){
                    //不存在,push,并保存index
                    tempArr.push(arrItem)
                //将索引存在对象里面,做判断用
                    arrIndexMap[mathIndex] = true
                }
            }
            console.log(tempArr)
            return tempArr
        }
        getMyArr(5)
        getMyArr(6)
        getMyArr(11)
    

    可以看到上面用对象实现的时候,主要区别是在判断生成的随机数是否重复的部分。程序将生成的随机数用对象的方式保存了起来,然后只需要到对象里面取值,看是否取到值即可,避免了去原素组里面遍历。这样不仅简化了实现过程,还提高了代码性能。

    最后,有疑问的小伙伴可以发邮箱到:
    630796280@qq.com

    以上代码都能在github上下载得到,对应的文件为:vue-study->src->test->getArr.html
    最后可以关注我的个人公众号,学习更多相关知识。
    公众号

  • 相关阅读:
    (十三)页面权限控制
    (十二)用户管理模块
    Vue笔记:生命周期和钩子函数
    (十一)第三方图标库
    (十)动态加载菜单
    windows下php配置环境变量
    docker在mac下安装及配置阿里云镜像加速
    pm2-web监控
    PHP判断两个矩形是否相交
    ubuntu下安装ffmpeg扩展
  • 原文地址:https://www.cnblogs.com/zhujieblog/p/12816883.html
Copyright © 2020-2023  润新知