Hola, estoy luchando y esperaba que tal vez alguien aquí pudiera ayudar. Estoy creando una aplicación web que usa una gran variedad de objetos que se parece a esto:
var arr = [ { prop1 : "foo", prop2 : ["foo1", "foo2", "foo3", "foo4"], prop3 : "foo5", prop4 : "foo6", }, { prop1 : "bar", prop2 : ["bar1", "bar2", "bar3", "bar4"], prop3 : "bar5", prop4 : "bar6", }, { prop1 : "something", prop2 : ["something1", "something2", "something3", "something4"], prop3 : "something5", prop4 : "something6", } ]La matriz es mucho más grande que eso, pero entiendes la idea. Quiero mostrar solo 5 objetos de la matriz al azar cada vez que se ejecuta el código, lo cual hice así:
randomArr = arr.sort(() => Math.random() - .5); spliceArr = randomArr.splice(5);Funciona, pero a veces muestra objetos de la matriz principal varias veces. ¿Cómo puedo escribir el código para que devuelva objetos de la matriz solo una vez?
Puede resolver esto creando una matriz de índices aleatorios únicos y luego devolver una matriz de objetos que correspondan a esos índices aleatorios.
Se puede usar un conjunto para garantizar que todos los índices generados sean únicos.
function getNRandomObjects(objectArray,numberOfObjects) { // use a set to ensure at most only one instance of an index is // generated const indices = new Set(); while(indices.size < numberOfObjects) { //generate a random index and add it to the set indices.add( Math.floor(Math.random() * objectArray.length)); } // convert the set of indices into an array, // then map each index to the object that corresponds // to that index. return Array.from(indices).map(i=>objectArray[i]); }