Получение случайного значения из массива JavaScript - PullRequest
660 голосов
/ 29 декабря 2010

Рассмотрим:

var myArray = ['January', 'February', 'March'];    

Как выбрать случайное значение из этого массива с помощью JavaScript?

Ответы [ 23 ]

1248 голосов
/ 29 декабря 2010
var rand = myArray[Math.floor(Math.random() * myArray.length)];
79 голосов
/ 19 августа 2011

Я обнаружил, что еще проще добавить функцию-прототип в класс 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)) {
        ...
    }
}

(Это может быть или не быть проблемой для вас.)

57 голосов
/ 19 июня 2015

Если у вас уже есть подчеркивание или 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);

или используйте метод _.sampleSize в lodash:

// will return two items randomly from the array using lodash
_.sampleSize(['January', 'February', 'March'], 2);
17 голосов
/ 14 августа 2012

Скажем, вы хотите выбрать случайный предмет, который отличается от последнего времени (не совсем случайный, но все же распространенное требование) ...

Опираясь на ответ @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)
17 голосов
/ 25 ноября 2015

Метод прототипа

Если вы планируете много получать случайное значение, вы можете определить для него функцию.

Во-первых, поместите это в свой код где-то:

Array.prototype.sample = function(){
  return this[Math.floor(Math.random()*this.length)];
}

Сейчас:

[1,2,3,4].sample() //=> a random element

Код, опубликованный в открытом доступе в соответствии с условиями лицензии CC0 1.0 .

11 голосов
/ 05 мая 2018

~~ намного быстрее, чем Math.Floor(), поэтому, когда дело доходит до оптимизации производительности при выводе с использованием элементов пользовательского интерфейса, ~~ выигрывает игру. ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

var rand = myArray[~~(Math.random() * myArray.length)];

Но если вы знаете, что в массиве будут миллионы элементов, вы, возможно, захотите пересмотреть битовый оператор и Math.Floor(), поскольку битовый оператор ведет себя страннос большими числами.См. Пример ниже, объясненный с выходом. ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

var number = Math.floor(14444323231.2); // => 14444323231
var number = 14444323231.2 | 0; // => 1559421343
10 голосов
/ 19 июля 2016

Самая короткая версия:

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]
7 голосов
/ 28 ноября 2014

Если у вас фиксированные значения (например, список названий месяцев) и вы хотите однострочное решение

var result = ['January', 'February', 'March'][Math.floor(Math.random() * 3)]

Вторая часть массива - это операция доступа, как описано в Почему [5,6,8,7] [1,2] = 8 в JavaScript?

4 голосов
/ 06 сентября 2018

Редактирование прототипа массива может быть вредным.Вот простая функция для выполнения работы.

function getArrayRandomElement (arr) {
  if (arr && arr.length) {
    return arr[Math.floor(Math.random() * arr.length)];
  }
  // The undefined will be returned if the empty array was passed
}

Использование:

// Example 1
var item = getArrayRandomElement(['January', 'February', 'March']);

// Example 2
var myArray = ['January', 'February', 'March'];
var item = getArrayRandomElement(myArray);
3 голосов
/ 11 сентября 2017

Если вы хотите записать его в одну строку, как решение Паскуаля, другим решением будет написать его, используя функцию поиска 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 и использование отдельной функции) - ваш путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...