En mi programa, cuando el usuario hace clic en un botón, un elemento (una cadena) de una matriz se selecciona aleatoriamente y luego se envía al usuario.
Mi objetivo es introducir algún tipo de funcionalidad de "eliminar este elemento de la matriz después de mostrarlo al usuario", para evitar la repetición de resultados. De esa manera, cada vez que vean un elemento nuevo, no verán los mismos una y otra vez.
Aquí está mi versión v1 de codificar esto:
Array1 = [] // the full array of all items is contained in here.
Array2 = [] // this is the post-display holding bay for items the user has seen already.
¿Después de enviar un elemento al usuario desde la matriz 1? Ese elemento se agregará a la Matriz 2. ¿ANTES de mostrar cualquier elemento de la matriz a un usuario? Hará una referencia cruzada del elemento seleccionado al azar con la lista completa de elementos en Array2, básicamente usando la lógica IF/ELSE IF. Algo como esto:
for (let i = 0; i < NumberOfArray2Items; i++) {
if (Array1ItemToDisplay === Array2[i]) {
NumberOfMatches = j++ // basically, increment a numerical variable, so that any value
// greater than 0 indicates, yes, it's been outputted to the user before
}
}
if (NumberOfMatches === 0) {
DisplayCurrentArrayItem();
} else if (NumberOfMatches > 0) {
SelectAnotherArrayItemToDisplay();
}
Esa es una versión aproximada de lo que tengo en mente y, francamente, suena como una solución terrible porque requiere dos pasos programáticos muy largos:
¿Existe algún método más simple y rápido para hacer una referencia cruzada de un elemento con una matriz completa? ¿O tal vez hacer una referencia cruzada de ambas matrices entre sí, para dejar solo los elementos restantes que no coinciden y luego seleccionar de esa lista intermedia de elementos que aún no se han mostrado?
Estas matrices contendrán decenas de miles de elementos, por lo que mi preocupación es que, tal como está escrito actualmente, este código tardará una eternidad en ejecutarse. ¿Hay alguna solución más simple, rápida y eficiente que no veo?
Aquí tienes, cada vez que se hace clic en el botón, se muestra un elemento aleatorio de la matriz. Luego, ese elemento se elimina, por lo que no se muestran duplicados.
const data = ['foo', 'bar', 'bat', 'baz'];
document.getElementById('btn').addEventListener("click", e => {
if(!data.length) return;
const idx = Math.floor(Math.random() * data.length);
console.log(data[idx]);
data.splice(idx, 1);
});
<button id=btn>click</button>
También agregué una verificación para asegurarme de que cuando no queden elementos únicos, no suceda nada, no estoy seguro de si esto es lo que quería o no. Si no, elimine la línea if(!data.length) return;