Рассмотрим:
var myArray = ['January', 'February', 'March'];
Как выбрать случайное значение из этого массива с помощью JavaScript?
Если вы планируете получать случайное значение много, вы можете определить для него функцию.
Сначала поставьте это в свой код где-нибудь:
Array.prototype.sample = function(){
return this[Math.floor(Math.random()*this.length)];
}
Теперь:
[1,2,3,4].sample() //=> a random element
Код, выпущенный публике домена в соответствии с условиями лицензии CC0 1.0.
Если у вас уже есть подчеркивание или lodash, включенные в ваш проект, вы можете использовать _.sample.
// will return one item randomly from the array
_.sample(['January', 'February', 'March']);
Если вам нужно получить более одного элемента случайным образом, вы можете передать это как второй аргумент в подчеркивании:
// will return two items randomly from the array using underscore
_.sample(['January', 'February', 'March'], 2);
или использовать метод подчеркивания в lodash:
// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
Если у вас есть фиксированные значения (например, список имен в месяц) и требуется однострочное решение
var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]
Вторая часть массива - это операция доступа, как описано в разделе «Почему» [5, 6,8,7] [1,2] = 8 в JavaScript?
Предположим, вы хотите выбрать случайный элемент, отличный от последнего (не очень случайное, но все же общее требование) ...
Основываясь на ответе @Markus, мы можем добавить другая функция прототипа:
Array.prototype.randomDiffElement = function(last) {
if (this.length == 0) {
return;
} else if (this.length == 1) {
return this[0];
} else {
var num = 0;
do {
num = Math.floor(Math.random() * this.length);
} while (this[num] == last);
return this[num];
}
}
И реализовать так:
var myRandomDiffElement = myArray.randomDiffElement(lastRandomElement)
Простая функция:
var myArray = ['January', 'February', 'March'];
function random(array) {
return array[Math.floor(Math.random() * array.length)]
}
random(myArray);
ИЛИ
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
ИЛИ
var myArray = ['January', 'February', 'March'];
function random() {
return myArray[Math.floor(Math.random() * myArray.length)]
}
random();
Рекурсивная автономная функция, которая может возвращать любое количество элементов (идентичное lodash.sampleSize):
function getRandomElementsFromArray(array, numberOfRandomElementsToExtract = 1) {
const elements = [];
function getRandomElement(arr) {
if (elements.length < numberOfRandomElementsToExtract) {
const index = Math.floor(Math.random() * arr.length)
const element = arr.splice(index, 1)[0];
elements.push(element)
return getRandomElement(arr)
} else {
return elements
}
}
return getRandomElement([...array])
}
Я нашел способ преодоления осложнений верхнего ответа, просто связав переменную rand с другой переменной, которая позволяет отображать это число внутри вызова myArray [] ;. Удалив новый массив, созданный и работающий с его осложнениями, я придумал рабочее решение:
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var myArray = ['January', 'February', 'March', 'April', 'May'];
var rand = Math.floor(Math.random() * myArray.length);
var concat = myArray[rand];
function random() {
document.getElementById("demo").innerHTML = (concat);
}
</script>
<button onClick="random();">
Working Random Array generator
</button>
</body>
</html>
На мой взгляд, лучше, чем возиться с прототипами или объявлять его как раз вовремя, я предпочитаю подвергать его окну:
window.choice = function() {
if (!this.length || this.length == 0) return;
if (this.length == 1) return this[0];
return this[Math.floor(Math.random()*this.length)];
}
Теперь в любом месте вашего приложения вы называете это:
var rand = window.choice.call(array)
Таким образом, вы можете использовать for(x in array) loop правильно
Создайте одно случайное значение и перейдите к массиву
Пожалуйста, попробуйте следующий код ..
//For Search textbox random value
var myPlaceHolderArray = ['Hotels in New York...', 'Hotels in San Francisco...', 'Hotels Near Disney World...', 'Hotels in Atlanta...'];
var rand = Math.floor(Math.random() * myPlaceHolderArray.length);
var Placeholdervalue = myPlaceHolderArray[rand];
alert(Placeholdervalue);
Я нашел еще проще добавить функцию прототипа в класс Array:
Array.prototype.randomElement = function () {
return this[Math.floor(Math.random() * this.length)]
}
Теперь я могу получить случайный массив, просто набрав:
var myRandomElement = myArray.randomElement()
Обратите внимание, что это добавит свойство ко всем массивам, поэтому, если вы перебираете один из них с помощью for..in, вы должны использовать .hasOwnProperty():
for (var prop in myArray) {
if (myArray.hasOwnProperty(prop)) {
...
}
}
(Это может быть или не быть хлопот для вас.)
Это похоже на, но более общее, чем решение @Jacob Relkin:
Это ES2015:
const randomChoice = arr => {
const randIndex = Math.floor(Math.random() * arr.length);
return arr[randIndex];
};
Код работает, выбирая случайное число между 0 и длина массива, а затем возвращает элемент в этом индексе.
Вот пример того, как это сделать:
$scope.ctx.skills = data.result.skills;
$scope.praiseTextArray = [
"Hooray",
"You\'re ready to move to a new skill",
"Yahoo! You completed a problem",
"You\'re doing great",
"You succeeded",
"That was a brave effort trying new problems",
"Your brain was working hard",
"All your hard work is paying off",
"Very nice job!, Let\'s see what you can do next",
"Well done",
"That was excellent work",
"Awesome job",
"You must feel good about doing such a great job",
"Right on",
"Great thinking",
"Wonderful work",
"You were right on top of that one",
"Beautiful job",
"Way to go",
"Sensational effort"
];
$scope.praiseTextWord = $scope.praiseTextArray[Math.floor(Math.random()*$scope.praiseTextArray.length)];
Эта работа как прелесть для меня без повторения.
var Random_Value = Pick_Random_Value(Array);
function Pick_Random_Value(IN_Array)
{
if(IN_Array != undefined && IN_Array.length > 0)
{
var Copy_IN_Array = JSON.parse(JSON.stringify(IN_Array));
if((typeof window.Last_Pick_Random_Index !== 'undefined') && (window.Last_Pick_Random_Index !== false))
{
if(Copy_IN_Array[Last_Pick_Random_Index] != undefined)
{
Copy_IN_Array.splice(Last_Pick_Random_Index,1);
}
}
var Return_Value = false;
if(Copy_IN_Array.length > 0)
{
var Random_Key = Math.floor(Math.random() * Copy_IN_Array.length);
Return_Value = Copy_IN_Array[Random_Key];
}
else
{
Return_Value = IN_Array[Last_Pick_Random_Index];
}
window.Last_Pick_Random_Index = IN_Array.indexOf(Return_Value);
if(window.Last_Pick_Random_Index === -1)
{
for (var i = 0; i < IN_Array.length; i++)
{
if (JSON.stringify(IN_Array[i]) === JSON.stringify(Return_Value))
{
window.Last_Pick_Random_Index = i;
break;
}
}
}
return Return_Value;
}
else
{
return false;
}
}
Использование Faker.js:
const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);
static generateMonth() {
const theDate = ['January', 'February', 'March'];
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};
Вы устанавливаете постоянную переменную в массив, тогда у вас есть другая константа, которая выбирает случайным образом между тремя объектами в массиве, а затем функция просто возвращает результаты.
Самая короткая версия:
var myArray = ['January', 'February', 'March'];
var rand = myArray[(Math.random() * myArray.length) | 0]
var item = myArray[Math.floor(Math.random()*myArray.length)];
или эквивалентная более короткая версия:
var item = myArray[(Math.random()*myArray.length)|0];
Пример кода:
var myArray = ['January', 'February', 'March'];
var item = myArray[(Math.random()*myArray.length)|0];
console.log('item:', item);
Если вы хотите записать его на одной строке, например, в решении Pascual, другое решение - записать его с помощью функции поиска ES6 (на основании того факта, что вероятность случайного выбора одного из элементов n - 1/n):
var item = ['A', 'B', 'C', 'D'].find((_, i, ar) => Math.random() < 1 / (ar.length - i));
console.log(item);
Используйте этот подход для целей тестирования и если есть веская причина не сохранять массив только в отдельной переменной. В противном случае другие ответы (floor(random()*length и использование отдельной функции) - ваш путь.