How To Get A New Array Containing Some Random Elements From An Old Array In Javascript
I am making a quiz app in react native, it has this array of objects in which each object contains a question statement,choices and the correct choice. There will be total 15 objec
Solution 1:
use JS random method to generate random numbers from 0 to 15
//your whole set of questions array
const questions = [
new quizQuestions(
'What is capital of Pakistan?',
['Karachi', 'Islamabad', 'Lahore', 'Peshawar'],
'Islamabad',
),
new quizQuestions(
'What is capital of India?',
['delhi', 'Islamabad', 'zcjzj', 'Peshawar'],
'delhi',
),
new quizQuestions(
'What is capital of Pakistan?',
['Karachi', 'Islamabad', 'Lahore', 'Peshawar'],
'Islamabad',
),
];
//random 5 question array
const selectedQuestionArr = [];
let addedIndex = [];
for (var i = 0; i < 5; i++) {
let randomIdx;
do {
randomIdx = Math.floor(Math.random() * 15);
}
while(addedIndex.indexOf(randomIdx) > -1);
//record added index to not include it in the next cycle
addedIndex.push(randomIdx);
//push the randomly selected question
selectedQuestionArr.push(questions[randomIdx]);
}
console.log(selectedQuestionArr);
Solution 2:
Very much random what you need.
Using generator function
:
const questions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
function* randomise(arr, numOfElem) {
// Create a copy of question so that wont effect actual array
let copyArray = [...arr];
// Use copyArray to generate random as closure, so that it never go out of index
const getRandom = () => Math.floor(Math.random() * copyArray.length);
// This is generator function run always
while (true) {
// If numOfElem is greater, then clone again
// suppose you have 15 question but you take 6. SO after 2 iteration, copyArray will have only 3 element so clone again
if (numOfElem > copyArray.length) {
// Clone again
copyArray = [...arr];
}
// pick 5 random data.
let result = [];
for (let i = 0; i < numOfElem; i++) {
result.push(copyArray.splice(getRandom(), 1)[0]);
}
yield result;
}
}
const questionGenerator = randomise(questions, 5);
console.log(questionGenerator.next().value); // random [ 11, 3, 7, 2, 8 ]
console.log(questionGenerator.next().value); // random [ 12, 13, 14, 9, 5 ]
console.log(questionGenerator.next().value); // random [ 6, 1, 4, 15, 10 ]
console.log(questionGenerator.next().value); // random [ 14, 12, 8, 2, 13 ]
console.log(questionGenerator.next().value); // random [ 9, 3, 10, 6, 11 ]
Same but without generator function
.
const questions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
const randomise = (arr, numOfElem) => {
let copyArray = [...arr];
const getRandom = () => Math.floor(Math.random() * copyArray.length);
return () => {
// If numOfElem is greater, then clone again
// suppose you have 15 question but you take 6. SO after 2 iteration, copyArray will have only 3 element so clone again
if (numOfElem > copyArray.length) {
// Clone again
copyArray = [...arr];
}
// pick 5 random data.
let result = [];
for (let i = 0; i < numOfElem; i++) {
result.push(copyArray.splice(getRandom(), 1)[0]);
}
return result;
};
};
const questionGenerator = randomise(questions, 5);
console.log(questionGenerator()); // random [ 11, 3, 7, 2, 8 ]
console.log(questionGenerator()); // random [ 12, 13, 14, 9, 5 ]
console.log(questionGenerator()); // random [ 6, 1, 4, 15, 10 ]
console.log(questionGenerator()); // random [ 14, 12, 8, 2, 13 ]
console.log(questionGenerator()); // random [ 9, 3, 10, 6, 11 ]
Solution 3:
For your particular case, i couldn't find any lodash function for this i have implemented my own javascript logic for this you can have a look.
Solution 4:
Almost a repeat of Azad's answer :D but I found our method to be very simple and straight forward. pass in selectedQuestions as an empty array
function randomizeQuestions(allQuestions,selectedQuestions,numberToSelect)
{
selectedIndex = [];
var randIndex;
for(var i = 0; i < numberToSelect; i++)
{
do{
randIndex = Math.floor(Math.random() * allQuestions.length);
}while(selectedIndex.includes(randIndex));
selectedIndex.push(randIndex);
selectedQuestions.push(allQuestions[randIndex]);
}
}
Post a Comment for "How To Get A New Array Containing Some Random Elements From An Old Array In Javascript"