Случайным образом добавить подмножество вопросов из JSON Банк вопросов в опрос JS Викторина - PullRequest
0 голосов
/ 14 апреля 2020

Я нахожусь в процессе создания викторины с использованием библиотеки js опроса. Для этого теста у меня есть банк вопросов, из которого я хотел бы выбрать случайным образом.

Для этого я сохранил JSON объектов - сериализованных в JSON вопросов. Вот рабочий пример - https://plnkr.co/edit/gnL4gv75uowDPyEU

Теперь это работает для добавления каждого вопроса на страницу с использованием foreach l oop. Вместо этого, я хотел бы случайно добавить только 2 вопроса из 4.

Концептуально я понимаю, как это сделать, но я относительно новичок в программировании.

Вот моя мысль процесс для того, что должно быть сделано:

  1. Получить случайное число, используя случайный случай Фишера-Йейтса:

function shuffle(array) {
    var i = array.length,
        j = 0,
        temp;

    while (i--) {

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    return array;
}

var ranNums = shuffle([1,2,3,4]);
Добавить вопрос из JSON по порядковому случайному номеру на страницу. Повторите это дважды, чтобы добавить два вопроса.

Это кажется относительно простым, но когда я go реализую его, я не могу понять, как на самом деле сериализовать json. Кроме того, даже когда я выясняю, как сериализовать вопросы json и выбираю их соответствующим образом, я не понимаю синтаксиса, необходимого для добавления вопроса. Может кто-нибудь помочь с этим?

Ответы [ 2 ]

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

Используя советы @TSV, я смог найти решение этой проблемы. Для получения случайного массива он использует случайную последовательность fisher-yates. Затем я склеиваю этот массив до желаемой длины. Вот плункер для тех, у кого похожая проблема - https://plnkr.co/edit/I4vXNTFEgIP9zy1s?open=lib%2Fscript.js

function shuffle(array) {
    var i = array.length,
        j = 0,
        temp;

    while (i--) {

        j = Math.floor(Math.random() * (i+1));

        // swap randomly chosen element with current element
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    return array;
}
var ranNums = shuffle([0,1,2,3]);

var randomQuestionSelection = ranNums.slice(0,2);

for(var i = 0; i < randomQuestionSelection.length; i++) {
  var randomQuestionJson = questionJSONs[randomQuestionSelection[i]];
  var question = page.addNewQuestion(randomQuestionJson.type, randomQuestionJson.name);
  question.fromJSON(randomQuestionJson);
}
0 голосов
/ 16 апреля 2020

Вы можете хранить JSON объектов - сериализованных до JSON вопросов. Эти объекты могут храниться как JSON в БД или как сериализованные строки JSON. Вы можете десериализовать JSON объекты из строки с помощью функции JSON.parse и добавить десериализованный объект в массив с потенциальными вопросами - questionJSONs. После этого вы можете добавить вопросы из этого массива в свой опрос. Вот рабочий образец - https://plnkr.co/edit/gnL4gv75uowDPyEU

    var questionJSONs = [
        {
            name: "name",
            type: "text",
            title: "Please enter your name:",
            placeHolder: "Jon Snow",
            isRequired: true
        }, {
            name: "birthdate",
            type: "text",
            inputType: "date",
            title: "Your birthdate:",
            isRequired: true
        }, {
            name: "color",
            type: "text",
            inputType: "color",
            title: "Your favorite color:"
        }, {
            name: "email",
            type: "text",
            inputType: "email",
            title: "Your e-mail:",
            placeHolder: "jon.snow@nightwatch.org",
            isRequired: true,
            validators: [
                {
                    type: "email"
                }
            ]
        }
    ];

var json = {
    pages: [{name: "page1"}]
};

window.survey = new Survey.Model(json);
var page = survey.pages[0];
questionJSONs.forEach(function(questionJson) {
    var question = page.addNewQuestion(questionJson.type, questionJson.name);
    question.fromJSON(questionJson);
});
...