为测验应用程序洗牌2个以上的数组
shuffle more than 2 array for quiz application?
我需要随机显示问题以及相应的选择和答案。为此,我有3个阵列,
1) array1用于问题
2) array2用于选择
3) 数组3用于回答
例如:
var questions = [
"q1",
"q2",
"q3",
"q4",
];
var choices = [
[
"choice1",
"choice2",
"choice3",
"choice4"
],
[
"choice1",
"choice2",
"choice3",
],
[
"choice1",
"choice2",
"choice3",
],
[
"choice1",
"choice2",
],
[
"choice1",
"choice2",
"choice3",
"choice4"
],
];
var answers = [
[1,1,0,1],
[0,1,0],
[0,1],
[1,1,1,0],
];
我有下面的代码,它对单个数组很好,但我想对多个数组实现同样的方法。
function shuffle(source){
var l=source.length-1;
for(var i=l; i>0; i--){
var itemIndex=Math.floor(Math.random()*(i+1));
var item=source[i];
source[i] = source[itemIndex];
source[itemIndex]=item;
}
return source;
}
你能告诉我,实现的最佳方法是什么吗
您可以使用与用于单个数组的方法相同的方法来混洗多个数组。毕竟,您不是在看内容,而是在看数组索引。
首先,让我们稍微重写一下您的函数,使其返回一个副本并保持输入数组不变。它还将交换中继到一个额外的功能:
function swap(arr, i, j)
{
var s = arr[i];
arr[i] = arr[j];
arr[j] = s;
}
function shuffle(arr) {
var l = arr.length;
arr = arr.concat([]); // Make a copy
while (l--) {
var j = Math.floor(Math.random() * l);
swap(arr, j, l);
}
return arr;
}
我们现在可以对单个阵列执行所有操作对阵列阵列执行操作:
function shuffleMany(arr) {
if(arr.length == 0) return [];
var l = 0;
for (var i = 0; i < arr.length; i++) {
if (i == 0) l = arr[i].length;
if (arr[i].length != l) return undefined;
arr[i] = arr[i].concat([]);
}
while (l--) {
var j = Math.floor(Math.random() * l);
for (var i = 0; i < arr.length; i++) {
swap(arr[i], j, l);
}
}
return arr;
}
无论我们在第一个版本中在哪里使用arr
,现在我们都在循环中使用arr[i]
。必须注意确保所有数组的长度相同,但除此之外,这很简单:对所有数组使用相同的交换索引:
使用这样的功能:
var array = [
["A", "B", "C", "D", "E", "F"],
["1", "2", "3", "4", "5", "6"],
[0, 1, 2, 3, 4, 5],
];
var x = shuffleMany(array);
console.log(x[0]);
console.log(x[1]);
console.log(x[2]);
最后,正如评论者已经告诉你的那样,解决方案是将属于一起的东西放在一起,即重新组织你的数组。然后排序和混洗就变成了对顶级数组的简单操作。
相关文章:
- 如何使用 node.js 比较两个 json 数组
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 在数组中的一个元素上设置多个值
- 访问$.ajax()函数中的两个不同数组
- 在对象数组中查找多个值的d3范围
- 正在更新mongod中两个对象内部的数组
- 如何循环通过2个对象数组并通过匹配id进行合并
- 如何使用javascript合并两个对象数组
- 使用filter和map方法将数组中某些元素的第一个字母大写-JavaScript
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 在数组JS中查找三个重复项
- 如何获取数组第一个元素的范围
- JSON数组-多个有效答案的可能性
- 编写一个函数,将数组(第一个参数)拆分为大小(第二个参数)的长度组,并将它们作为多维数组返回
- 使用.shift()更新数组'5个元素
- JavaScript 过滤器数组多个条件
- 如果数组第一个元素中的字符串包含数组第二个元素中字符串的所有字母,则返回true
- Javascript序列化数组多个表单问题
- 编写一个函数,将数组(第一个参数)拆分为大小相同的组(第二个参数),并将其作为多维数组返回