Javascript 洗牌超过2个数组用于测验应用程序?

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

我需要随机显示问题以及相应的选项和答案。对于这个,我有3个数组

1阵列1用于提问

2阵列2用于选择

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;
}

最后,正如评论员已经告诉您的那样,解决方案是将属于同一组的内容保持在一起,即重新组织数组。然后排序和洗牌就成为顶级数组上的简单操作。

您需要洗牌数组本身吗?您可以将一系列问题索引混排,然后在提问时查找相应的问题、选项和答案。或者,例如,将每个问题的问题、选项和答案组合成一个简单的结构,使它们保持在一起?我同意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]);