Получение случайного значения из массива в JavaScript
Описание проблемы на русском для StackOverflow:
У меня есть массив, содержащий названия месяцев:
var myArray = ['January', 'February', 'March'];
Как я могу выбрать случайное значение из этого массива с использованием JavaScript?
5 ответ(ов)
Это простая однострочная функция:
const randomElement = array[Math.floor(Math.random() * array.length)];
Например:
const months = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль"];
const random = Math.floor(Math.random() * months.length);
console.log(random, months[random]);
Этот код выбирает случайный элемент из массива months
. Мы генерируем случайное число в диапазоне от 0 до длины массива (не включая её) и используем его в качестве индекса для получения элемента.
Вы можете рассмотреть возможность определения функции в прототипе массива, чтобы создать метод [].sample()
, который будет возвращать случайный элемент.
Сначала, чтобы определить функцию прототипа, добавьте следующий код в ваше приложение:
Array.prototype.sample = function() {
return this[Math.floor(Math.random() * this.length)];
}
Теперь, чтобы получить случайный элемент из массива, просто вызовите .sample()
:
[1, 2, 3, 4].sample() //=> случайный элемент
Не забудьте учитывать, что изменение встроенных объектов в JavaScript может привести к неожиданным последствиям, особенно если ваш код будет интегрирован с сторонними библиотеками или фреймворками.
Самый короткий вариант кода для выбора случайного элемента из массива в JavaScript:
var myArray = ['Январь', 'Февраль', 'Март'];
var rand = myArray[(Math.random() * myArray.length) | 0];
console.log(rand);
В этом примере создается массив myArray
с названиями месяцев. Затем с помощью Math.random()
выбирается случайный индекс, который используется для доступа к элементу массива. Оператор | 0
используется для преобразования значения в целое число. После этого выбранный случайный месяц выводится в консоль.
Вы хотите выбрать случайный элемент из массива, который будет отличаться от последнего выбранного элемента (хотя это не совсем случайный выбор, но довольно распространенная необходимость). Вот пример функции, которая это реализует:
/**
* Возвращает случайный элемент из массива, который
* отличается от `last` (при условии, что в массиве больше 1 элемента).
* Возвращает null, если массив пуст.
*/
function getRandomDifferent(arr, last = undefined) {
if (arr.length === 0) {
return null;
} else if (arr.length === 1) {
return arr[0];
} else {
let num = 0;
do {
num = Math.floor(Math.random() * arr.length);
} while (arr[num] === last);
return arr[num];
}
}
Пример использования функции:
const arr = [1, 2, 3];
const r1 = getRandomDifferent(arr); // r1 может быть, например, 1
const r2 = getRandomDifferent(arr, r1); // r2 будет отличаться от r1.
В этом коде, если вы вызовете getRandomDifferent(arr)
сначала, она вернет один из элементов массива arr
. При следующем вызове с использованием r1
в качестве второго аргумента, функция выберет другой элемент, гарантируя, что он отличается от предыдущего. Если массив пуст или состоит из одного элемента, функция корректно обрабатывает эти случаи, возвращая null
или элемент массива соответственно.
Многие из предлагаемых решений добавляют метод к конкретному массиву, что ограничивает его использование только этим массивом. В приведённом решении представлен переиспользуемый код, который подходит для любого массива и может быть сделан типобезопасным.
TypeScript
export function randChoice<T>(arr: Array<T>): T {
return arr[Math.floor(Math.random() * arr.length)];
}
JavaScript
function randChoice(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
Таким образом, функция randChoice
позволяет выбрать случайный элемент из любого массива, что делает её универсальным решением.
Генерация случайного числа в диапазоне между двумя числами в JavaScript
Генерация случайной строки/символов в JavaScript
Генерация случайных целых чисел в JavaScript в заданном диапазоне
Как перемешать (сделать случайным) массив в JavaScript?
Как создать диалог с кнопками "Ок" и "Отмена"