2015-03-25 24 views
0

我需要随机显示问题以及相应的选择和答案。为此,我有3阵列,洗牌超过2阵列的测验应用程序?

1)ARRAY1为问题

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

可否请你告诉我,什么是实现这一

+2

你需要自己洗牌阵列吗?您可以对一系列问题索引进行整理,然后在问问时查找相应的问题,选择和答案。或者例如将每个问题的问题,选择和答案结合到一个简单的结构中,以便将它们放在一起?你可以在这里使用你的方法一次性洗牌。 – Rup 2015-03-25 12:29:22

+1

我同意Rup的建议,将所有内容合并到一个数组中:'var quiz = [{question:“Highest mountain”,choices:[{text:“Everest”,score:1},{text:“K2”score :0},...]},...]' – 2015-03-25 12:40:09

+0

不,现在不可能改变结构。因为渲染逻辑或视图渲染代码已经完成。我们必须通过使用不同的数组来完成 – niran 2015-03-25 12:46:16

回答

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]); 

最后,正如评论者已经告诉你的,解决方案是将所有属于一起的东西都保存在一起,即重新组织数组。然后排序和洗牌变成顶层数组上的简单操作。