function shuffle(array) {
let counter = array.length;
// While there are elements in the array
while (counter > 0) {
// Pick a random index
let index = Math.floor(Math.random() * counter);
// Decrease counter by 1
counter--;
// And swap the last element with it
let temp = array[counter];
array[counter] = array[index];
array[index] = temp;
}
return array;
}
/**
* Shuffles array in place.
* @param {Array} a items An array containing the items.
*/
function shuffle(a) {
var j, x, i;
for (i = a.length - 1; i > 0; i--) {
j = Math.floor(Math.random() * (i + 1));
x = a[i];
a[i] = a[j];
a[j] = x;
}
return a;
}
ES2015 (ES6) version
/**
* Shuffles array in place. ES6 version
* @param {Array} a items An array containing the items.
*/
function shuffle(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
var myArray = ['1','2','3','4','5','6','7','8','9'];
shuffle(myArray);
Implement prototype
Using Object.defineProperty (Method taken from this SO answer) we can also implement the function as a prototype method for the array without having to have it appear in something like in a loop like for (i in arr). The following code will allow you to call arr.shuffle() to shuffle an array arr:
Object.defineProperty(Array.prototype, 'shuffle', {
value: function() {
for (let i = this.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[this[i], this[j]] = [this[j], this[i]];
}
return this;
}
});
You can use Fisher-Yates Shuffle (code adapted from this website):
Uses a modern version of the Fisher–Yates shuffling algorithm :
ES2015 (ES6) version
But be aware that using destructuring swap variables As of October 2017, allocations can incur severe performance penalties.
use
Implement prototype
Using
Object.defineProperty
(Method taken from this SO answer) we can also implement the function as a prototype method for the array without having to have it appear in something likein a loop like for (i in arr)
. The following code will allow you to callarr.shuffle()
to shuffle an arrayarr
: