Есть массив, элементы которого нужно вывести в случайном порядке, например, в слайд-шоу или в игре.
Это можно делать 3 способами: Можно выбирать случайный элемент и удалять его из массива, пока в массиве ничего не останется. Другой подход - перемешать элементы массива (2 способа), после чего их можно будет выводить или как-то обрабатывать по очереди.
Случайное число из заданного диапазона
Функция random
Для получения случайного номера элемента массива используем метод random() объекта Math, который возвращает псевдо-случайное число >= 0 и < 1.
Случайное число от 0 до n включительно:
Math.floor( Math.random( ) * (n+1) )
Случайное число в диапазоне от m до n:
function randomNumber (m,n)
{
m = parseInt(m);
n = parseInt(n);
return Math.floor( Math.random() * (n - m + 1) ) + m;
}
Извлечение элементов из массива
Функция splice
Изменяет содержимое массива, добавляя новые элементы и удаляя старые. Возвращает массив из удалённых элементов.
splice(index, howMany, [element1][, ..., elementN])
index - индекс начала изменения массива.
howMany - количество удаляемых элементов.
element1, ..., elementN - элементы, добавляемые в массив. Если новые элементы не заданы, выполняется удаление из массива.
Выбираем случайный элемент, обрабатываем его и удаляем из массива, затем выбираем случайный элемент из оставшихся и т.д..
function mytest(myarray)
{
var i = myarray.length, j;
alert(myarray.join());
while(i)
{
j = Math.floor( (i--) * Math.random() );
// ... обработка элемента myarray[j]
myarray.splice(j, 1);
// удаленный элемент и оставшиеся элементы массива:
alert(j + "n" + myarray.join()); // контроль
}
return this;
};
Перестановка элементов массива
Случайно выбранный элемент из n элементов массива меняем местами с последним (n) элементом. Затем случайно выбранный элемент из n-1 элементов массива меняем местами с последним (n-1) элементом и т.д..
/*
Если необязательный аргумент deep равен true, также
обрабатываются вложенные массивы
(по умолчанию false)
*/
Array.prototype.shuffle1 = function( deep )
{
var i = this.length, j, t;
while(i)
{
j = Math.floor( (i--) * Math.random() );
t = deep && typeof this[i].shuffle!=='undefined' ? this[i].shuffle():this[i];
this[i] = this[j];
this[j] = t;
}
return this;
};
Примеры использования:
var a = new Array(1,2,3,4,5); a.shuffle1(); alert(a.join()); // Перемешать, включая вложенные массивы: a=['a','b','c', [1,2,3,4,5], 'D','E','F'].shuffle1(true); alert(a.join());
(источник: http://www.tigir.com/javascript.htm)
Сортировка
Функция sort
Используем метод sort(функция сравнения) класса Array:
Если функция сравнения не задана, массив сортируется в словарном порядке (каждый элемент преобразуется в строку), т.е. "10" идёт перед "2".
Функция сравнения
Функция сравнения определяет порядок сортировки.
function compare(a, b) {
if (a меньше b)
return -1; // после сортировки b идет перед a
if (a больше b)
return 1; // после сортировки b идет после a
// иначе
return 0; // после сортировки положение b и a не изменяестя
}
Для сравнения чисел функция сравнения может просто вычитать b из a:
function compareNumbers(a, b) {
return a - b
}
Сортировка в случайном порядке
Если функция сравнения возвращает отрицательные и положительные числа в случайном порядке, сортировка также выполняется в случайном порядке.
function shuffle2( array ) {
array.sort(function() {return 0.5 - Math.random();});
return true;
}
Пример использования:
function test() {
var a = ['a','b','c', [1,2,3,4,5], 'D','E','F'];
alert(a.join());
shuffle2(a);
alert(a.join());
}
<a href="#" onclick="test();">shuffle</a>