Отображать случайные вопросы из API - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть один вопрос. Я делаю викторину, и мне нужна твоя помощь. Нам нужно отобразить случайные вопросы без повторения. Я не знаю, как это сделать. Я новичок в JavaScript. Под моим кодом.

 import { State } from "../../../framework/StateBase";
import { Conversation } from "../../../framework/ConversationBase";
import { getLanguage } from "../../../gateways/GigaaaGateway";
import { RatherGameGateway } from "../gateway/RatherGameGateway";

export class GetUserQuestionState extends State {
    constructor(conversation: Conversation, name: string) {
        super(conversation, name);
    }
    public configure(convo: any, bot: any) {
        convo.beforeThread(this.name, async convo => {

            let gateway = new RatherGameGateway();
            let age = this.conversation.payload.userAges;
            let ageCategory: number;

            try {
                let lang = await getLanguage(this.conversation.languageId, bot);
                if (age > 11) {
                    ageCategory = 0;
                    let result = await gateway.findLangCodeAndAge(lang.code, ageCategory);
                    if (this.conversation.payload.counter === 0) {
                        this.conversation.payload.params.question = result[0].questions[Math.floor(Math.random())];
                    } else if (this.conversation.payload.counter > 0) {
                        this.conversation.payload.params.next_question = result[0].questions[this.conversation.payload.counter];
                    }
                    this.conversation.payload.counter++;

                } else if (age >= 4 && age <= 11) {
                    ageCategory = 1;
                    let result = await gateway.findLangCodeAndAge(lang.code, ageCategory);
                    if (this.conversation.payload.counter === 0) {
                        this.conversation.payload.params.question = result[0].questions[0];
                    } else if (this.conversation.payload.counter > 0) {
                        this.conversation.payload.params.next_question = result[0].questions[this.conversation.payload.counter];
                    }
                    this.conversation.payload.counter++;
                }

            } catch (error) {
                this.conversation.payload.error = true;
            }
            convo.gotoThread(this.conversation.getNextState());
        });
    }
}

Просто посмотрите, если l oop. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Что бы я сделал с точки зрения высокого уровня:

  1. Имею 2 списка вопросов (для 2 возрастных групп).
  2. Перемешайте соответствующий набор Вопросы
  3. извлеките последний элемент из набора вопросов, чтобы показать его пользователю.
  4. повтор.

Хорошо, допустим, у вас есть два списка или массива вопросов :

let smallQuestions = ['how many fingers do you have', 'what does the dog say', 'what color is a sheep', 'how old are you'];
let bigQuestions = ['how many kids do you have', 'did you do your taxes', 'do you own a car', 'do you drink alcohol'];

Теперь давайте напишем небольшую функцию для перемешивания массива:

const shuffleArray = arr => arr
  .map(a => [Math.random(), a])
  .sort((a, b) => a[0] - b[0])
  .map(a => a[1]);

Теперь несколько псевдокодов, чтобы показать сценарий:

let smallQuestions = ['how many fingers do you have', 'what does the dog say', 'what color is a sheep', 'how old are you'];
let bigQuestions = ['how many kids do you have', 'did you do your taxes', 'do you own a car', 'do you drink alcohol'];
const shuffleArray = arr => arr
  .map(a => [Math.random(), a])
  .sort((a, b) => a[0] - b[0])
  .map(a => a[1]);

const askMeSomething = (age) => {
  if (age > 11) {
    bigQuestions = shuffleArray(bigQuestions);
    return bigQuestions.pop();
  } else if (age >= 4) {
    smallQuestions = shuffleArray(smallQuestions);
    return smallQuestions.pop() || 'out of questions';
  } else return 'too young';
}

console.log(askMeSomething(3));
console.log(askMeSomething(4));
console.log(askMeSomething(5));
console.log(askMeSomething(6));
console.log(askMeSomething(7));
console.log(askMeSomething(8));
0 голосов
/ 21 апреля 2020

Команда let order = [...Array(numberOfItems).keys()].map(x => ({val:x,rand:Math.random()})).sort((a,b) => a.rand - b.rand).map(x => x.val); создаст список длиной numberOfItems, но с элементами, отсортированными случайным образом. (Предметы будут проиндексированы 0).

Например, если numberOfItems = 10, это даст список вроде: [9, 5, 4, 1, 8, 3, 7, 6, 0, 2].

Затем вы можете просто просмотреть этот список, чтобы выяснить, какой вопрос задать, не повторяя один .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...