首页 > 解决方案 > 将 JSON 问题库中的问题子集随机添加到调查 JS 测验

问题描述

我正在使用调查 js 库创建测验。对于这个测验,我有一堆问题,我想从中随机选择。

为此,我存储了 JSON 对象 - 序列化为 JSON 问题。这是工作示例 - https://plnkr.co/edit/gnL4gv75uowDPyEU

现在,这适用于通过利用 foreach 循环将每个问题添加到页面。相反,我想随机添加 4 个问题中的 2 个。

从概念上讲,我理解如何做到这一点,但我对编程比较陌生。

以下是我对需要做的事情的思考过程:

  1. 使用 Fisher-Yates shuffle 获取随机数:

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]);

  1. 将序列化随机数处的 JSON 问题添加到页面。重复两次以添加两个问题。

这看起来相对简单,但是当我去实现它时,我似乎无法弄清楚如何实际序列化 json。此外,即使我弄清楚如何序列化 json 问题并相应地选择它,我也不明白添加问题的必要语法。有人可以帮忙吗?

标签: javascriptjsonsurveyjs

解决方案


您可以存储 JSON 对象 - 序列化为 JSON 问题。这些对象可以存储为 DB 中的 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);
});

推荐阅读