Estoy tratando de generar una identificación aleatoria en un conjunto muy explícito de requisitos.
Hay 3 matrices itemsAvailable , itemsSeen y itemsTaken .
itemsAvailable se ve así: [{ id: 1, ... }, ...] una matriz de objetos con varios campos, los otros campos no importan para los propósitos de esta funcionalidad, solo nos interesa el campo id . Es un número que es 1 -> X , X aumenta en 1 por cada elemento presente.
itemsSeen es solo una matriz de las identificaciones que un usuario ha visto, por lo que si vieron las identificaciones para 1, 7, 16 , se vería como itemsSeen = [1, 7, 16] .
itemsTaken también es solo una matriz de los ID que han visto que eligieron tomar, por ejemplo, itemsTaken = [1, 16] . Solo pueden tomar elementos que hayan estado presentes en itemsSeen .
Al comienzo de la función, se genera una identificación aleatoria en función de la longitud de los itemsAvailable . La identificación de cada elemento coincidirá con su posición de índice.
Si itemsSeen o itemsTaken incluyen la identificación aleatoria, genera una nueva dentro de los límites de la longitud de itemsAvailable hasta que no esté presente en ninguna matriz.
Cuando se genera un número y se muestra al usuario, debe agregarse a la matriz itemsSeen . Si se selecciona ese elemento, debe agregarse a la matriz itemsAvailable . Luego obtenga un elemento aleatorio de itemsAvaialbe nuevamente.
sandbox de código de lo que tengo.
Gracias a Barmar por ayudar a simplificar la solución.
Cambié la implementación para usar solo dos matrices, seleccionando un elemento aleatorio de la primera matriz, eliminándolo y luego agregándolo a la segunda matriz.
var itemsAvailable = []; var currentItem; for (let i = 0; i < 25; i++) { itemsAvailable.push({ id: i }); } var itemsSeen = [{ id: 3 }, { id: 7 }, { id: 16 }]; const getRandomId = (arr, length) => { var r = arr[Math.floor(Math.random() * length)]; if (itemsSeen.includes(r)) { r = arr[Math.floor(Math.random() * length)]; } return r; }; const generateRandomId = () => { if (itemsAvailable.length === 0) { return; } var nextItem = getRandomId(itemsAvailable, itemsAvailable.length); itemsSeen.push(nextItem); itemsAvailable = itemsAvailable.filter((item) => item !== nextItem); currentItem = nextItem; };