有時候咱們須要在必定範圍內生成一組不重複的隨機數組,咱們可能會這樣作: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