2015-03-25 62 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]); 

最後,正如評論者已經告訴你的,解決方案是將所有屬於一起的東西都保存在一起,即重新組織數組。然後排序和洗牌變成頂層數組上的簡單操作。