Crystal
Crystal

Reputation: 1505

How do I shuffle an array within an array?

SETUP Description: I am building a trivia game that has a spinner. This spinner is split up into 6 categories (the 6th category being ALL previous 5 categories combined). The first 5 categories will have it's own set of questions. Once the spinner stops on a category a form appears that will ask a series of questions in order according to it's category. Each question has 3 choices, 1 of them being the correct choice.

Below is a short question bank array to illustrate what I am thinking: ```

var questionBankArray = 
 [{
    category: "Category1",
    question: "What does the following expression return? <br> 3 / 'bob';",
    choices: ["undefined", "ReferenceError", "NaN"],
    correctAnswer: "NaN"
   },{
     category: "Category1"
     question: "What is a method?",
     choices: ["Used to describe an object.", "A function assigned to an object.", "Performs a function on one or more operands or variables."],
     correctAnswer: "A function assigned to an object."
   },{
     category: "Category2"
     question: "Which company first implemented the JavaScript language?",
     choices: ["Netscape Communications Corp.", "Microsoft Corp.", " Sun Microsystems Corp."],
     correctAnswer: "Netscape Communications Corp."
    },{
     category: "Category2"
     question: "When was the first release of a browser supporting JavaScript?",
     choices: ["1996", "1995", " 1994"],
     correctAnswer: "1995"
    },
 ];

```

I would like to go through the questionBanArray of objects, and by category, shuffle within that category. I also want to be able to shuffle the choices within each question of that category. How would I go about this? Would it be harder easier to rewrite it to look like this:

questionBankArray = 
[{
  CategoryBank1: 
    [{
        question1: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
        },{
        question2: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
     }],
   CategoryBank2: 
     [{
        question1: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
        },{
        question2: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
      }]
 }];

Upvotes: 0

Views: 62

Answers (1)

Wout De Rooms
Wout De Rooms

Reputation: 657

I think the ideal structure would be something like this:

questionBankArray = 
  [{
    category:"first category",
    questions: 
      [{
        question1: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
      },{
        question2: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
      }]
  },
  {
    category: "second category",
    questions:
      [{
        question1: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
      },{
        question2: "What is blank?", 
        choices: ["choice1","choice2","answer"], 
        answer: "answer"
      }]
    }];

Create a shuffle function:

function shuffle(o){
    for(var j, x, i = o.length; i; j = Math.floor(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
    return o;
}

Start looping over your outer array and go deeper and deeper, applying the shuffle function from the most inner level to the outer array

for (var category in questionBankArray) {
  for (var question in category.questions) {
    shuffle(question.choices);
  }
  shuffle(category);
}
shuffle(questionBankArray);

Upvotes: 2

Related Questions