Reputation: 65
I have an array items which have 29 values. Im selecting 9 values randomly from array items .
my problems is while selecting 9 elements randomly, values get repeated more than once in selected 9 elements.
How to avoid this repetion of same elements
var items = [
{ label: '1', url: '1.png' },
{ label: '2', url: '2.png' },
{ label: '3', url: '3.png' },
{ label: '4', url: '4.png' },
{ label: '5', url: '5.png' },
{ label: '6', url: '6.png' },
{ label: '7', url: '7.png' },
{ label: '8', url: '8.png' },
{ label: '9', url: '9.png' },
{ label: '10', url:'10.png' },
];
for (var index = 0; index <4; index++)
{
randomIndex = Math.floor(Math.random() * items.length);
console.log(randomIndex);
}
Upvotes: 3
Views: 41
Reputation: 97130
You can use a Set
. Because it doesn't allow duplicate elements, you can just keep on adding until its size reaches 9.
const items = [{label:'1',url:'1.png'},{label:'2',url:'2.png'},{label:'3',url:'3.png'},{label:'4',url:'4.png'},{label:'5',url:'5.png'},{label:'6',url:'6.png'},{label:'7',url:'7.png'},{label:'8',url:'8.png'},{label:'9',url:'9.png'},{label:'10',url:'10.png'},{label:'11',url:'11.png'},{label:'12',url:'12.png'},{label:'13',url:'13.png'},{label:'14',url:'14.png'},{label:'15',url:'15.png'},{label:'16',url:'16.png'},{label:'17',url:'17.png'},{label:'18',url:'18.png'},{label:'19',url:'19.png'},{label:'20',url:'20.png'},{label:'21',url:'21.png'},{label:'22',url:'22.png'},{label:'23',url:'23.png'},{label:'24',url:'24.png'},{label:'25',url:'25.png'},{label:'26',url:'26.png'},{label:'27',url:'27.png'},{label:'28',url:'28.png'},{label:'29',url:'29.png'}];
const selected = new Set();
while (selected.size <= 9) {
selected.add(items[Math.floor(Math.random() * items.length)]);
}
console.log([...selected]);
This works well as long as your array to select from is substantially larger than the number of items you want to select. If not, performance might suffer because of duplicate elements being selected over and over again.
Upvotes: 2
Reputation: 370679
You need to select items without replacement. One method would be to remove the random item from the array when you choose it:
var items=[{label:'1',url:'1.png'},{label:'2',url:'2.png'},{label:'3',url:'3.png'},{label:'4',url:'4.png'},{label:'5',url:'5.png'},{label:'6',url:'6.png'},{label:'7',url:'7.png'},{label:'8',url:'8.png'},{label:'9',url:'9.png'},{label:'10',url:'10.png'},]
for (var index = 0; index < 9; index++) {
const randomIndex = Math.floor(Math.random() * items.length);
const [randomItem] = items.splice(randomIndex, 1);
console.log(randomItem);
}
If you need the original array to stay as is, without mutation, then you can create a copy first, and remove items from that copy:
const itemsTemp = items.slice();
Upvotes: 3