Javascript 洗牌超过2个数组用于测验应用程序?
我需要随机显示问题以及相应的选项和答案。对于这个,我有3个数组 1阵列1用于提问 2阵列2用于选择 3数组3用于回答问题 例如:Javascript 洗牌超过2个数组用于测验应用程序?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我需要随机显示问题以及相应的选项和答案。对于这个,我有3个数组 1阵列1用于提问 2阵列2用于选择 3数组3用于回答问题 例如: var questions = [ "q1", "q2", "q3", "q4", ]; var choices = [ [ "choice1", "choice2", "choice3", "choice4" ], [ "choic
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;
}
最后,正如评论员已经告诉您的那样,解决方案是将属于同一组的内容保持在一起,即重新组织数组。然后排序和洗牌就成为顶级数组上的简单操作。您需要洗牌数组本身吗?您可以将一系列问题索引混排,然后在提问时查找相应的问题、选项和答案。或者,例如,将每个问题的问题、选项和答案组合成一个简单的结构,使它们保持在一起?我同意Rup的建议,将所有内容合并成一个数组:var测验=[{问题:最高峰,选项:[{文本:珠穆朗玛峰,分数:1},{文本:K2,分数:0},…},…]不,改变结构现在是不可能的。因为渲染逻辑或视图渲染代码已经完成。我们必须使用不同的数组
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]);