我需要随机显示问题以及相应的选择和答案。为此,我有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;
}
请您告诉我,实现这一目标的最佳方法是什么?
答案 0 :(得分:0)
您可以使用与单个阵列相同的方法来混洗许多阵列。毕竟,你不是仅仅在数组索引处使用内容。
首先,让我们稍微重写一下你的函数,这样它就会返回一个副本并保持输入数组不变。它还将交换转发到一个额外的功能:
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]);
最后,正如评论者已经告诉过你的那样,解决方案是将所有属于一起的东西保存在一起,即重新组织你的数组。然后排序和混洗成为顶级数组的简单操作。