Estoy buscando un método para elegir objetos aleatorios de una matriz de objetos donde una propiedad específica tiene un valor único.
Ejemplo:
const array = [ { name:'foo', message: 'hello' }, { name:'foo', message: 'world' }, { name:'bar', message: 'hello' }, { name:'bar', message: 'world' }, ] function theMagicMethod(elementsCount, specificUniqueProperty){ // ... }; console.log(theMagicMethod(2, name)); // Expected output: [{name:'foo', message:'hello'},{name:'bar', message:'hello'}] // or [{name:'foo', message:'hello'},{name:'bar', message:'world'}] // etc... // BUT NEVER WANT: [{name:'foo', message:'hello'},{name:'foo', message:'world'}]Intenté usar do... while o while... pero siempre falla cuando agrego condicionalmente un elemento a mi matriz de resultados:
let items = []; do{ let item = array[Math.floor(Math.random()*array.length)]; let found = false; for(var i = 0; i < vendors.length; i++) { if (vendors[i].Name == 'Magenic') { found = true; break; } } if(!found){ items.push(item) } } while (items.length < 3)Mezcla los objetos, usa un conjunto para filtrar valores únicos, devuelve el primer N...
// fy shuffle, thanks to https://stackoverflow.com/a/2450976/294949 function shuffle(array) { let currentIndex = array.length, randomIndex; while (currentIndex != 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } return array; } function theMagicMethod(elementsCount, specificUniqueProperty) { let shuffled = shuffle(array.slice()); let uniqueValues = new Set() let unique = shuffled.filter(el => { const value = el[specificUniqueProperty]; const keep = !uniqueValues.has(value) uniqueValues.add(value); return keep; }) return unique.slice(0, elementsCount); }