2017-02-02 3 views
1

Ich versuche, ein Multiple-Choice-Quiz zu erstellen, die nicht nur die vier Antwortoptionen jedes Mal mischt, sondern auch die Reihenfolge, in der die Fragen erscheinen, wenn der Benutzer das gleiche Quiz durchführt.Shuffling verschiedener Teile von verschachtelten Array

Hier ist der Code, den ich arbeiten:

function fisherYates(myArray) { 
var i = myArray.length, j, tempi, tempj; 
if (i === 0) return false; 
while (--i) { 
    j = Math.floor(Math.random() * (i + 1)); 
    tempi = myArray[i]; 
    tempj = myArray[j]; 
    myArray[i] = tempj; 
    myArray[j] = tempi; 
} 
} 
$(function() { 
    content = [ 
     ["Q1",["Q1-1", "Q1-2", "Q1-3", "Q1-4"]], 
     ["Q2",["Q2-1", "Q2-2", "Q2-3", "Q2-4"]], 
     ["Q3",["Q3-1", "Q3-2", "Q3-3", "Q3-4"]] 
    ]; 

    $.each(content, function(i) { fisherYates(this) }); 
    fisherYates(content); 
}) 

Dieser mischt die Fragen, aber ich sehe, dass ich auch einen Schritt tiefer gehen die Optionen unter jeder Frage Wert verschachtelt zu mischen. Ich habe ein begrenztes Verständnis dafür, wie $.each() funktioniert und wie dies innerhalb der geschachtelten Arrays ausgeführt wird.

Die entscheidende Sache ist, dass das resultierende Array die gemischten Optionen nicht von der Frage trennen sollte, mit der sie verbunden sind.

Nicht sicher, ob verschachtelter Arrays der richtige Weg ist, um dieser zu gehen, anstatt einen Hash verwenden (obwohl der Schlüssel in der Tatsache liegt, dass ich verwenden, nur das Wort „assoziiert“ in diesem letzten Absatz!)

TIA

+2

Wie wäre es mit '{fisherYates (this); Fischerei (das [1])}? – georg

+0

obwohl ich das upvoted, dachte ich, dass es dasselbe wie Bartek Suskis Lösung unten ist. Ich habe es nicht sorgfältig genug gelesen. Als ich dies anwendete, erschienen die Fragen nach den Optionen im resultierenden Array. Keine große Sache, aber nicht genau das, was ich will. –

Antwort

2

Ihr Code mischt Fragen mit Antworttabellen. Sie müssen nur eine Ebene tiefer in jede Funktion gehen.

$(function() { 
    content = [ 
     ["Q1",["Q1-1", "Q1-2", "Q1-3", "Q1-4"]], 
     ["Q2",["Q2-1", "Q2-2", "Q2-3", "Q2-4"]], 
     ["Q3",["Q3-1", "Q3-2", "Q3-3", "Q3-4"]] 
    ]; 

    $.each(content, function(i) { fisherYates(this[1]) }); 
    fisherYates(content); 
}); 
+0

Ja, das ist eleganter als die 'for'-Schleife, die ich ausgeführt habe, als ich' content' auf 'content [i]' bearbeitet habe, um es auf eine alternative Weise zu lösen –