Javascript 如何从数组中选择一个随机项,以及如何在x个时间段内进行去盎司?

Javascript 如何从数组中选择一个随机项,以及如何在x个时间段内进行去盎司?,javascript,arrays,Javascript,Arrays,原始问题: 这是我的问题,我有一个登录帐户需要使用的令牌列表,我可以完全随机分配这些项目,但我想删除我使用了大约30秒的令牌,因为在这段时间内,帐户正在使用,其他人无法使用。我如何才能在一段时间内从阵列中移除令牌,并在x时间后将其放回阵列中?(30秒) 我想到的解决方案: 我创建了2个函数,一个用于从数组中检索随机令牌,另一个用于实际执行移除令牌并在x时间(30秒)内将其放入数组中的函数 我的代码: const tokens=[“Token1”、“Token2”、“Token3”];//代币 函

原始问题:

这是我的问题,我有一个登录帐户需要使用的令牌列表,我可以完全随机分配这些项目,但我想删除我使用了大约30秒的令牌,因为在这段时间内,帐户正在使用,其他人无法使用。我如何才能在一段时间内从阵列中移除令牌,并在x时间后将其放回阵列中?(30秒)

我想到的解决方案:

我创建了2个函数,一个用于从数组中检索随机令牌,另一个用于实际执行移除令牌并在x时间(30秒)内将其放入数组中的函数

我的代码:

const tokens=[“Token1”、“Token2”、“Token3”];//代币
函数runToken(index,value){//执行从数组中删除元素并将其放回数组的工作。
tokens.splice(索引,1);//从数组中删除所选的标记
setTimeout(()=>{//等待5秒将数组元素推回
tokens.push(value);//将其推回的操作
}, 30000);
}
函数getActiveToken(){//用于从数组中获取项的函数
让chosenToken=tokens[Math.floor(Math.random()*tokens.length)];//选择数组中可用的随机元素
让chosenTokenIndex=tokens.indexOf(chosenToken);//检索索引以供以后使用
runToken(chosenTokenIndex,chosenToken);//运行上面的函数以删除令牌,然后将其推回
return chosenToken;//返回令牌以便使用。
}
log(getActiveToken());
//--“令牌1”

如果你有一个更有效的方法来做这件事,我很乐意看到它

随着阵列大小的增加,添加和删除项目可能会成为昂贵的操作。因此,在这种情况下,我们可以使用“交换”。每当我们随机选择一个项目时,将其与最后一个元素交换,并在指定的时间内将其从选择范围中排除

const tokens=[“Token1”、“Token2”、“Token3”、“Token4”、“Token5”、“Token6”];
常数延迟=2000;//2秒
函数getToken(){
if(getToken.limit==未定义){
getToken.limit=getToken.limit | | tokens.length;
}else if(getToken.limit==0){
返回“无活动令牌”;
}
var index=Math.floor(Math.random()*getToken.limit);
var activeToken=tokens[index];
令牌[index]=令牌[getToken.limit-1];
令牌[getToken.limit-1]=activeToken;
getToken.limit--;
setTimeout(函数(){
getToken.limit++;
},延误);
返回activeToken;
};
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
setTimeout(函数(){
log(getToken());

},3000);随着阵列大小的增加,添加和删除项可能会成为昂贵的操作。因此,在这种情况下,我们可以使用“交换”。每当我们随机选择一个项目时,将其与最后一个元素交换,并在指定的时间内将其从选择范围中排除

const tokens=[“Token1”、“Token2”、“Token3”、“Token4”、“Token5”、“Token6”];
常数延迟=2000;//2秒
函数getToken(){
if(getToken.limit==未定义){
getToken.limit=getToken.limit | | tokens.length;
}else if(getToken.limit==0){
返回“无活动令牌”;
}
var index=Math.floor(Math.random()*getToken.limit);
var activeToken=tokens[index];
令牌[index]=令牌[getToken.limit-1];
令牌[getToken.limit-1]=activeToken;
getToken.limit--;
setTimeout(函数(){
getToken.limit++;
},延误);
返回activeToken;
};
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
setTimeout(函数(){
log(getToken());

},3000);如果您已经找到解决方案,并且希望帮助其他用户解决相同的问题,请提出您最初要提出的问题,并将解决问题的代码作为您自己问题的答案。恭喜让它工作。顺便说一句,不要使用<代码> SETIFATION< /COD>和 CurrayStudio来延迟代码的时间,考虑使用<代码> SETTIMEOUT这是完全相同的,但只运行一次(不需要阻止它循环),而不是移除和添加元素到数组中,尝试将所选令牌交换到数组的末尾,并将范围更改为“选择随机索引”。如果您找到了解决方案,并且希望帮助其他用户解决相同的问题,请提出您最初要提出的问题,并将解决该问题的代码作为您自己问题的答案。恭喜让它工作。顺便说一句,不要使用<代码> SETIFATION< /COD>和 CurrayStudio来延迟代码的时间,考虑使用<代码> SETTIMEOUT这是完全相同的,但只运行一次(不需要阻止它循环),而不是移除和添加元素到数组中,尝试将所选令牌交换到数组末尾,并将范围更改为“选择随机索引”。