I have an array of players:
const players = [ { nickName: 'John', level: 5 }, { nickName: 'Doe', level: 4 }, { nickName: 'James', level: 4 }, { nickName: 'Moses', level: 5 }, { nickName: 'Chris', level: 3 }, { nickName: 'Dan', level: 3 }, ]
I would like to generate two new random arrays called teamA
and teamB
, but I want those teams to be equal by players level.
for example:
const teamA = [ { nickName: 'John', level: 5 }, { nickName: 'Doe', level: 4 }, { nickName: 'Dan', level: 3 }, ] const teamB = [ { nickName: 'Moses', level: 5 }, { nickName: 'James', level: 4 }, { nickName: 'Chris', level: 3 }, ]
I did manage to create two random arrays when I had array of strings without player’s level but now after I turned the array into array of objects I have no idea how to continue from here.
Any help would be appreciated.
Advertisement
Answer
We can do this with a simple enough approach.
Create a loop assigning players to the teams, one to each team for every round of the loop.
For team A, we pick a random player, then we assign a random player of the same level to team B.
Once the list of players is empty, we’re done.
const players = [ { nickName: 'John', level: 5 }, { nickName: 'Doe', level: 4 }, { nickName: 'James', level: 4 }, { nickName: 'Moses', level: 5 }, { nickName: 'Chris', level: 3 }, { nickName: 'Dan', level: 3 }, ] function takeRandomPlayer(arr, level) { let indexes = arr.reduce((acc, player, i) => { if (player.level === level || !level) acc.push(i); return acc; }, []); let index = indexes[Math.floor(Math.random()*indexes.length)]; return arr.splice(index, 1)[0]; } function createRandomTeams(players) { let teams = { teamA: [], teamB: [] }; do { let playerA = takeRandomPlayer(players); teams.teamA.push(playerA); teams.teamB.push(takeRandomPlayer(players, playerA.level)); } while (players.length); return teams; } const teams = createRandomTeams(players); console.log(teams);
.as-console-wrapper { max-height: 100% !important; top: 0; }