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
UsingObject.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:
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 useFisher-Yates Shuffle(code adapted fromthis website):
Usesa modern version of the Fisher–Yates shuffling algorithm:
ES2015 (ES6) version
But be aware that usingdestructuring 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
: