Есть массив, элементы которого нужно вывести в случайном порядке, например, в слайд-шоу или в игре.
Это можно делать 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>