const role = [ { name: 'Hitman' }, { name: 'Doctor' }, { name: 'Nurse' } ]Esta es mi matriz de objetos ahora estos son mis usuarios
const user = ['James', 'Harden']observe que solo hay dos, por lo que solo se usarán dos roles aleatorios de mi matriz de objetos ahora el resultado que quiero es
[ { name: 'Hitman' User: 'Harden' }, { name: 'Nurse' User: 'James' } ]Mira, usuario aleatorio para un rol aleatorio, ¿cómo puedo hacer eso?
Use esta respuesta para obtener un elemento aleatorio de una matriz de JavaScript
Utilice Array.map para recorrer sus usuarios y elegir un rol aleatorio para cada uno.
const role = [{ name: 'Hitman' }, { name: 'Doctor' }, { name: 'Nurse' } ]; const user = ['James', 'Harden']; const users = user.map(name => ({ name: role[Math.floor(Math.random() * role.length)].name, User: name })); console.log(users);Para hacerlo de manera única, realice una mezcla aleatoria en la matriz, luego asigne los valores secuencialmente...
// this thanks to https://stackoverflow.com/a/2450976/294949 function shuffle(array) { let currentIndex = array.length, randomIndex; while (currentIndex != 0) { // Pick a remaining element... randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; // And swap it with the current element. [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex] ]; } return array; } let role = [{ name: 'Hitman' }, { name: 'Doctor' }, { name: 'Nurse' } ]; shuffle(role); // when this is run, the role array is randomly reordered const user = ['James', 'Harden', 'Curry', 'Thompson', 'Green']; // assign roles sequentially, like dealing cards from the top of a shuffled deck const usersWithRoles = user.map((user, index) => { let roleName = index < role.length ? role[index].name : 'Hitman' return { name: user, roleName }; }); console.log(usersWithRoles);Otra solución:
Dado que desea evitar la duplicación de elementos de la matriz, la mejor manera es copiar la matriz y eliminar el elemento específico cada vez de la matriz creada. Esto podría mantener los datos originales.
const role = [{ name: 'Hitman', img: 'hitman.png'},{ name: 'Doctor', img: 'doc.png'},{ name: 'Nurse', img: 'nurse.png'}] const user = ['James', 'Harden', "Jason", "Iris"] let test = [] let left = JSON.parse(JSON.stringify(role)) for (let i of user) { if (left.length > 0) { let ran = Math.floor(Math.random() * left.length) test.push({ user: i,name: left[ran].name,img: left[ran].img}) left.splice(ran, 1) } else { test.push({user: i,name: "Hitman",img:'hitman.png'}) } } console.log(test)