Отображать только отдельные значения, если размер не равен желаемой длине возврат в цикл

#javascript #arrays

#javascript #массивы

Вопрос:

Я хочу отобразить 10 кавычек случайным образом, но я не хочу дубликатов (они должны быть разными). Итак, я поместил кавычки в массив, а затем добавил этот массив в набор, зная, что набор удалит все дубликаты. Проблема в том, что добавление их в набор приведет к удалению дубликатов, и я не получу столько кавычек, сколько хотел, но у него не будет дубликатов.

 const refreshQuotes = (count:number):any => {
  let quotesSelectedFromPool = [];
  
  let myArray = [];
  let mySet = new Set();
  for (let n:number=0; n<count; n  ) {
    let index:number = getRandom(0, quotesArchive.length - 1);
    myArray.push(quotesArchive[index]);
    quotesSelectedFromPool.push(quotesArchive[index]);
  
    console.log(quotesSelectedFromPool[n].id);
    mySet.add(quotesArchive[index]);
    myArray = Array.from(mySet);
    console.log(myArray);
    
 }
  let a = myArray.length;
  if (a == count){
    console.log("its equal");
    if (mySet.size == count){
      console.log(mySet.size, "this is my set size");
      return quotesSelectedFromPool = Array.from(mySet);
   }

  } else if ( a !== count){
  refreshQuotes(count);
}
 return quotesSelectedFromPool = Array.from(mySet);
  

Чего мне здесь не хватает? Правильно ли я это делаю? Я знаю, что есть много способов сделать это, но я думал, что этот способ сработает, какие-либо предложения ..?

Ответ №1:

Что-то вроде этого должно работать

 const quotesArchive = [
  "this is a test 1",
  "this is a test 2",
  "this is a test 3",
  "this is a test 4",
  "this is a test 5",
  "this is a test 6",
  "this is a test 7",
  "this is a test 8",
  "this is a test 9",
  "this is a test 10"
];

const getRandomQuotes = (count) => {

  // array to hold random quotes
  const retrievedQuotes = [];

  // loop until the count is 0
  while (count > 0) {

    // get a random integer between 1 and 10
    const idx = Math.floor(Math.random() * 10);
    
    // get the quote from the archive
    const quote = quotesArchive[idx];

    // if the quote is not already in the retrieved list, add it
    if (!retrievedQuotes.includes(quote)) {
      retrievedQuotes.push(quote);
      // decrement the count of quotes that is left to retrieve
      count--;
    }
  }

  return retrievedQuotes;
};

// pass in whatever count you want between 1 and 10
console.log(getRandomQuotes(2)); 
  

Комментарии:

1. Я не получаю дубликатов с вашим способом, но это не всегда дает мне желаемое количество кавычек, которые я просил каждый раз .. ?

2. поместите count— внутри оператора if

3. О да. Это верно. Я не проверял это тщательно. Хороший улов. Обновлено