【问题标题】:Using Javascript to randomly select 10 exercises from exercise bank (JSON)使用Javascript从练习库(JSON)中随机选择10个练习
【发布时间】:2018-04-01 12:01:38
【问题描述】:

标题中的“练习”指的是问题,但 StackOverflow 不允许标题中出现“问题”一词。

我首先要说的是,在谈到 Javascript 时,我还是个新手。我正在尝试做的是使用 JSON 构建一个问题库,格式如下:

 {"questionlist":[
  {
  "question":"Test question 1",
  "option1":"Answer1A",
  "option2":"Answer1B",
  "option3":"Answer1C"
  },
  {
  "question":"Test question 2",
  "option1":"Answer2A",
  "option2":"Answer2B",
  "option3":"Answer2C"
  },
  {
  "question":"Test question 3",
  "option1":"Answer3A",
  "option2":"Answer3B",
  "option3":"Answer3C"
  }
]
}

等等。然后我想做的是创建一个页面,使用 Javascript 从前面提到的问题库中随机选择 10 个问题(假设问题库总共包含大约 100 个问题)并以几乎相同的方式显示这 10 个问题一个现实生活中的测验就可以了(即不是一次一个,而是全部)。然后只有单选按钮来选择正确的答案,最后有一个“提交”按钮来检查答案。

用 Google 搜索这些东西太难了——我经常遇到关于 javascript 和 JSON 的测验或答案顺序随机的设计(而不是问题本身)。再次,很抱歉不能在这里用我的词汇获得过度的技术性。我希望有人能提供帮助,即使是初步设计 - 大约 3 人个人使用,因此不必完美优化。

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    对数组进行随机排序并从中取出 n 个元素的切片也可以解决问题:

    yourArrayOfItems.sort(() => Math.random() - 0.5).slice(0, 10);
    //                    ^ random sort method       ^ take 10 items
    

    【讨论】:

    • 哇,这真是一件奇怪的事情,+1 教了我一个有趣的方法!
    【解决方案2】:

    那么,让我们为你的目标制定一个 TLDR。

    您有 100 个问题。您希望从第一个数组中选择另一个包含 10 个问题的数组,以便在结果数组中没有重复的问题。

    我们该怎么做?

    您应该在数组边界内选择一个随机索引 10 次,每次检查您是否还没有选择该索引(换句话说,避免重复)。

    实现。

    我假设您将此对象存储在某个变量中。如果输入的字符串是有效的 JSON,则可以使用 JSON.parse()

    var obj = {"questionlist":[..., ..., ...]}
    

    首先,我们通过questionList键得到所有问题的数组。

    var list = obj.questionlist;
    

    现在让我们创建一个数组来包含生成的 10 个问题。

    var resultList;
    

    我们将通过将随机索引(>=0<list.length)推送 10 次来填充它,并且每次推送时不要忘记确保它是唯一索引。

    首先让我们决定如何选择随机索引。

    执行Math.random()可以接收[0,1]内的随机浮点数。现在要获得0 ... list.length 中的数字,我们只需将其乘以list.length。不要忘记它可能是一个浮点数,因此通过丢弃浮点数之后的部分(即,将数字取底)使其成为整数。
    结果公式为~~(Math.random()*list.length)

    让我们现在编写所有代码。

    for( var k = 0; k < 10; k++ ) {
        var randIndex = ~~(Math.random()*list.length);
        //check if the index is not duplicate
        if( resultList.indexOf(randIndex) < 0)
            resultList.push(randIndex);
        else
            // else the index is duplicate so we don't need it and should move one step back in the loop
            k--;
    }
    

    现在resultList 包含 10 个随机非重复问题索引。您现在可以通过循环 resultList 数组来输出 10 个随机问题的结果列表。

    for( var k = 0; k < resultList.length; k++ )
        console.log(list[resultList[k]]);
    

    【讨论】:

      【解决方案3】:

      请试试这个,其中'n'是你想要的随机元素的数量,

      const items = {
          "questionlist": [{
                  "question": "Test question 1",
                  "option1": "Answer1A",
                  "option2": "Answer1B",
                  "option3": "Answer1C"
              },
              {
                  "question": "Test question 2",
                  "option1": "Answer2A",
                  "option2": "Answer2B",
                  "option3": "Answer2C"
              },
              {
                  "question": "Test question 3",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              },
              {
                  "question": "Test question 4",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              },
              {
                  "question": "Test question 5",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              },
              {
                  "question": "Test question 6",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              },
              {
                  "question": "Test question 7",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              },
              {
                  "question": "Test question 8",
                  "option1": "Answer3A",
                  "option2": "Answer3B",
                  "option3": "Answer3C"
              }
          ]
      }
      
      function random_item(questions, n) {
          var arr = [];
          for (let i = 0; i < n; i++) {
              arr.push(questions[Math.floor(Math.random() * questions.length)])
          }
          return arr
      
      }
      
      console.log(random_item(items.questionlist, 2))

      【讨论】:

        【解决方案4】:

        这个函数从一个数组中随机选择N个问题:

        var bank = {
          "questionlist": [{
              "question": "Test question 1",
              "option1": "Answer1A",
              "option2": "Answer1B",
              "option3": "Answer1C"
            },
            {
              "question": "Test question 2",
              "option1": "Answer2A",
              "option2": "Answer2B",
              "option3": "Answer2C"
            },
            {
              "question": "Test question 3",
              "option1": "Answer3A",
              "option2": "Answer3B",
              "option3": "Answer3C"
            }
          ]
        }
        
        function selectN(bank, n) {
          var list = bank.questionlist;
          if (list.length < n) n = list.length; //to prevent endless loop
          var set = new Set(); //using a set to prevent duplication
          while (set.size < n) set.add(list[Math.floor(Math.random() * list.length)]);
          return Array.from(set)
        }
        
        console.log(selectN(bank, 2));

        【讨论】:

          【解决方案5】:

          你可以这样做。



          Math.random() 是一个函数,它给出一个介于 0 和 1 之间的浮点数。


          https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random



          Math.floor() 接受一个浮点数,并将其向下舍入到下一个整数。


          https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/floor




          var list = {"questionlist":[
            {
            "question":"Test question 1",
            "option1":"Answer1A",
            "option2":"Answer1B",
            "option3":"Answer1C"
            },
            {
            "question":"Test question 2",
            "option1":"Answer2A",
            "option2":"Answer2B",
            "option3":"Answer2C"
            },
            {
            "question":"Test question 3",
            "option1":"Answer3A",
            "option2":"Answer3B",
            "option3":"Answer3C"
            }
          ]
          }
          
          list = list.questionlist
          
          console.log(
              list[Math.floor(Math.random() * list.length)]['question']
          );

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-24
            • 1970-01-01
            • 2015-05-01
            • 1970-01-01
            • 2014-06-27
            • 1970-01-01
            相关资源
            最近更新 更多