Home > Back-end >  Why is this infinite loop?
Why is this infinite loop?

Time:06-15

I am trying to place three strings into an array size of 9 that holds them three string placed at random indexes in the array but how I am trying to do it is resulting in an infinite loop

const ticketArray = [];
const victoryMultipliers = ["x10", "x20", "x30", "x40", "x50", "x60"];

const threeOfThem = [];
let arr = []
let randStr = "";
for (let i = 0; i < 3; i  ) {
    threeOfThem[i] = victoryMultipliers[Math.floor(Math.random() * victoryMultipliers.length)]
    randStr = threeOfThem[i]
    //console.log(randStr)

    arr = threeOfThem.filter(val => val === randStr)

    if (arr.length >= 2) {
        threeOfThem.pop();
        i--;
    }

}
const threeTicketArray = threeOfThem;
/// So above we have an array of example ["x20", "x50", "x30"]

// so below is where we have some problem

let randInt;
let tempStr = "";
for (let i = 0; i < 10; i  ) { // i want to make an array.length of 9
    randInt = Math.floor( Math.random() * 3 );
    tempStr = threeTicketArray[randInt]; // to find the "x30" or whichever i stored

  ticketArray.push(tempStr); // push it into the ticketArray
  let len = ticketArray.filter(val => val === tempStr) // we filter to bring out the once for this loops iteration

    if ( len.length > 3 ) { // if I have 4 of example "x30"
        ticketArray.pop(); // I remove it as it was the last "x30" string added to the array
      i--; // I subtract the iteration by 1 so I can restart the this iteration of the loop
    }
}
// the end of the loop
console.log(ticketArray);

So at random I want ticketArray to be of size 9 the ticket strings to be placed at a random index and each string appears 3 times. However, I am getting an infinite loop I can't understand why!

CodePudding user response:

See the solution below, and tell me what you think

const ticketArray = [];
const victoryMultipliers = ["x10", "x20", "x30", "x40", "x50", "x60"];

const threeOfThem = [];
let arr = []
let randStr = "";
for (let i = 0; i < 3; i  ) {
    threeOfThem[i] = victoryMultipliers[Math.floor(Math.random() * victoryMultipliers.length)]
    randStr = threeOfThem[i]
    //console.log(randStr)

    arr = threeOfThem.filter(val => val === randStr)

    if (arr.length >= 2) {
        threeOfThem.pop();
        i--;
    }
    
}
const threeTicketArray = threeOfThem;
/// So above we have an array of example ["x20", "x50", "x30"]

// so below is where we have some problem


let randInt;
let tempStr = "";
for (let i = 0; i < 10; i  ) { // i want to make an array.length of 9
    randInt = Math.floor( Math.random() * 3 );
    tempStr = threeTicketArray[randInt]; // to find the "x30" or whichever i stored

  ticketArray.push(tempStr); // push it into the ticketArray
  let len = ticketArray.filter(val => val === tempStr) // we filter to bring out the once for this loops iteration
  
    if ( len.length > 3 ) { // if I have 4 of example "x30"
        ticketArray.pop(); 
        // this should solve the infinit loop issue. 
        // as it seems that randInt is generating dublicated.
        if (ticketArray.length <9)
           i-- 
    }
}
// the end of the loop
console.log(ticketArray);

  • Related