如何从数组中选择一个随机项目,以及如何在x时间内消除抖动?

时间:2019-12-16 23:17:08

标签: javascript arrays solution

原始问题:

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

我想到的解决方案:

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

我的代码:

const tokens = ["Token1", "Token2", "Token3"]; // Tokens

function runToken(index, value) { // Does the work of removing the element from the array and placing it back in the array.
  tokens.splice(index, 1); // Removes the chosen token from the array
  setTimeout(() => { // waits 5 seconds to push the array element back
    tokens.push(value); // Action to push it back
  }, 30000);
}

function getActiveToken() { // Function to use in order to get the item from the array
  let chosenToken = tokens[Math.floor(Math.random() * tokens.length)]; // Chooses a random element avaliable in the array
  let chosenTokenIndex = tokens.indexOf(chosenToken); // Retrieves the index for use later
  runToken(chosenTokenIndex, chosenToken); // Runs the function above to remove the token and push it back later
  return chosenToken; // Returns the token so that you can use it.
}

console.log(getActiveToken());
         //-- "Token1"

如果您有更有效的方法,我希望看到它!

1 个答案:

答案 0 :(得分:0)

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

const tokens = ["Token1", "Token2", "Token3", "Token4" , "Token5", "Token6" ];      
const delay = 2000; // 2 Seconds

function getToken() {

    if( getToken.limit == undefined ){
        getToken.limit = getToken.limit || tokens.length;
    } else if (getToken.limit == 0) {
        return "No Active token";
    }
    
    var index = Math.floor(Math.random()* getToken.limit );    
    var activeToken = tokens[index];

    tokens[index] = tokens[getToken.limit-1];
    tokens[getToken.limit-1] = activeToken;       
    
    getToken.limit --;        
    setTimeout(function() {
        getToken.limit ++;
    },delay);    
    return activeToken;
};

console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
console.log(getToken())
setTimeout(function(){
    console.log(getToken());        
},3000);