使用Javascript从练习库(JSON)中随机选择10个练习

时间:2018-04-01 12:01:38

标签: javascript json

"练习"在标题中提到问题,但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个问题。与现实生活测验一样的方式(即一次不是一个,而是所有这些)。然后只需要单选按钮来选择正确的答案,最后有一个"提交"检查答案的按钮。

谷歌这个东西真是太可怕了 - 我大多数时候都会遇到关于javascript和JSON的测验或者答案顺序随机化的设计(不是问题本身)。再次,抱歉我的词汇不能过于技术化。我希望有人可以提供帮助,即使是基本的设计 - 它将用于约3人的个人使用,因此不必进行完美优化。

5 个答案:

答案 0 :(得分:1)

随机对数组进行排序,从中获取n个项目也可以解决问题:

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

答案 1 :(得分:0)

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

@app.route("/getfile", methods=["POST"])
def getfile():
    file_name = request.form["file_name"]
    with open(file_name, 'r') as f:
        file_content = f.read()
    return file_content

答案 2 :(得分:0)

所以,让我们有你的目标TLDR。

你有100个问题的数组。您希望从第一个数组中选择另外10个问题的数组,因此在结果数组中没有重复的问题。

我们怎么做?

你应该在数组范围内选择一个随机索引10次,每次检查你是否已经选择了那个索引(换句话说,避免重复)。

实现。

我想你将这个对象存储在一些变量中。如果您将输入作为有效JSON的字符串,则可以使用JSON.parse()

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

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

var list = obj.questionlist;

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

var resultList;

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

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

执行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 :(得分:0)

此函数随机选择数组中的N个问题:

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 4 :(得分:0)

你可以这样做。



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




&#13;
&#13;
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']
);
&#13;
&#13;
&#13;