23

I need to implement a randomization from JSON result.

The format of the JSON is two objects:

result:

Question(object)

[Object { id="4c6e9a41470b19_96235904",  more...}, 
 Object { id="4c784e6e928868_58699409",  more...}, 
 Object { id="4c6ecd074662c5_02703822",  more...}, 6 more...]

Topic(object)

[Object { id="3jhf3533279827_23424234",  more...}, 
 Object { id="4634663466cvv5_43235236",  more...}, 
 Object { id="47hf3892735298_08476548",  more...}, 2 more...]

I want to randomize the order of the objects inside the question object and the topic objects.

1
  • 3
    Those are not objects, those are arrays containing objects. Commented Nov 19, 2014 at 9:52

3 Answers 3

38

You could use a Fisher-Yates-Durstenfeld shuffle:

var shuffledQuestionArray = shuffle(yourQuestionArray);
var shuffledTopicArray = shuffle(yourTopicArray);

// ...

function shuffle(sourceArray) {
    for (var i = 0; i < sourceArray.length - 1; i++) {
        var j = i + Math.floor(Math.random() * (sourceArray.length - i));

        var temp = sourceArray[j];
        sourceArray[j] = sourceArray[i];
        sourceArray[i] = temp;
    }
    return sourceArray;
}
Sign up to request clarification or add additional context in comments.

Comments

13

Easiest method (not perfect shuffle, but in some cases may be better):

function randomize(a, b) {
    return Math.random() - 0.5;
}

yourQuestionArray.sort(randomize);
yourTopicArray.sort(randomize);

or

yourQuestionArray.sort(function (a, b) {return Math.random() - 0.5;});
yourTopicArray.sort(function (a, b) {return Math.random() - 0.5;});

( http://jsfiddle.net/dJVHs/ )

2 Comments

For larger arrays this will (probably) be slower than a Fisher-Yates shuffle too. The shuffle will be O(n) whereas using sort will (probably) be O(n log n).
@LukeH OK, you are right. But this is more beautiful :P
7

I found this post on using the Fisher-Yates algorithm to shuffle an array in JavaScript. It uses this function:

function fisherYates ( myArray ) {
  var i = myArray.length;
  if ( i == 0 ) return false;
  while ( --i ) {
     var j = Math.floor( Math.random() * ( i + 1 ) );
     var tempi = myArray[i];
     var tempj = myArray[j];
     myArray[i] = tempj;
     myArray[j] = tempi;
   }
}

1 Comment

You don't have to make tempj

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.