有時(shí)候我們需要在一定范圍內(nèi)生成一組不重復(fù)的隨機(jī)數(shù)組辙培,我們可能會(huì)這樣做:
//需求:在一個(gè)已知的數(shù)組中,隨機(jī)選取一部分組成新的數(shù)據(jù)邢锯,要求數(shù)組元素不重復(fù)出現(xiàn):
//常規(guī)實(shí)現(xiàn)
var arr = [3,5,30,20,21,50,80,6,8,10,15]
//去重一下,不去重扬蕊,可能造成死循環(huán)
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('無(wú)法獲取指定長(zhǎng)度的數(shù)組!')
return
}
while (tempArr.length < len){
falg = false
//向下取整丹擎,得到0-(arrLen - 1)的整數(shù)
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)
運(yùn)行截圖:
運(yùn)行截圖
可以看到,這樣實(shí)現(xiàn)的方式篇幅比較長(zhǎng)再愈,中間主要是由于要判斷是否有重復(fù)數(shù)組做了大量處理榜苫,我們換一個(gè)種方式來(lái)實(shí)現(xiàn)。
var arr = [3,5,30,20,21,50,80,6,8,10,15]
//去重一下,不去重翎冲,可能造成死循環(huán)
arr = arr.filter(function(element,index,self){
return self.indexOf(element) === index;
});
// 對(duì)象替換數(shù)組的方式實(shí)現(xiàn):
var getMyArr = function (len) {
var tempArr = []
var mathIndex
var arrLen = arr.length
var arrItem
var arrIndexMap = {}
if(len > arrLen){
console.log('無(wú)法獲取指定長(zhǎng)度的數(shù)組垂睬!')
return
}
while (tempArr.length < len){
//向下取整,得到0-(arrLen - 1)的整數(shù)
mathIndex = Math.floor(Math.random() * arrLen)
arrItem = arr[mathIndex]
//判斷是否重復(fù)
if(!arrIndexMap[mathIndex]){
//不存在抗悍,push驹饺,并保存index
tempArr.push(arrItem)
//將索引存在對(duì)象里面,做判斷用
arrIndexMap[mathIndex] = true
}
}
console.log(tempArr)
return tempArr
}
getMyArr(5)
getMyArr(6)
getMyArr(11)
可以看到上面用對(duì)象實(shí)現(xiàn)的時(shí)候缴渊,主要區(qū)別是在判斷生成的隨機(jī)數(shù)是否重復(fù)的部分赏壹。程序?qū)⑸傻碾S機(jī)數(shù)用對(duì)象的方式保存了起來(lái),然后只需要到對(duì)象里面取值衔沼,看是否取到值即可蝌借,避免了去原素組里面遍歷。這樣不僅簡(jiǎn)化了實(shí)現(xiàn)過(guò)程指蚁,還提高了代碼性能菩佑。