巧用對象,生成不重複隨機數

有時候咱們須要在必定範圍內生成一組不重複的隨機數組,咱們可能會這樣作:javascript

//需求:在一個已知的數組中,隨機選取一部分組成新的數據,要求數組元素不重複出現:
    //常規實現
    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)
複製代碼

運行截圖: html

運行截圖

能夠看到,這樣實現的方式篇幅比較長,中間主要是因爲要判斷是否有重複數組作了大量處理,咱們換一個種方式來實現。vue

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)
複製代碼

能夠看到上面用對象實現的時候,主要區別是在判斷生成的隨機數是否重複的部分。程序將生成的隨機數用對象的方式保存了起來,而後只須要到對象裏面取值,看是否取到值便可,避免了去原素組裏面遍歷。這樣不只簡化了實現過程,還提升了代碼性能。java

最後,有疑問的小夥伴能夠發郵箱到: 630796280@qq.comgit

以上代碼都能在github上下載獲得,對應的文件爲:vue-study->src->test->getArr.html 最後能夠關注個人我的公衆號,學習更多相關知識。 github

公衆號
相關文章
相關標籤/搜索