Рассматривать:
var myArray = ['January', 'February', 'March'];
Как я могу выбрать случайное значение из этого массива, используя JavaScript?
javascript
Сара
источник
источник
Math.floor(Math.random(...))
звонок, который округляется вниз.var rand = myArray[Math.random() * myArray.length>>0]
что был немного быстрееvar rand = myArray[Math.random() * myArray.length | 0]
Если у вас уже есть подчеркивание или перевод текста, вы можете использовать их
_.sample
.Если вам нужно получить более одного элемента случайным образом, вы можете передать это в качестве второго аргумента в подчеркивании:
или используйте
_.sampleSize
метод в lodash:источник
Метод прототипа
Если вы планируете много получать случайное значение, вы можете определить для него функцию.
Во-первых, поместите это в свой код где-нибудь:
Сейчас же:
Код передан в общественное достояние в соответствии с условиями лицензии CC0 1.0 .
источник
.sample()
любой массив, чтобы получить случайный элемент~~
намного быстрее, чемMath.Floor()
, поэтому, когда дело доходит до оптимизации производительности при создании вывода с использованием элементов пользовательского интерфейса,~~
выигрывает игра. БОЛЬШЕ ИНФОРМАЦИИНо если вы знаете, что в массиве будут миллионы элементов, вы, возможно, захотите пересмотреть
Math.Floor()
битовый оператор, поскольку битовый оператор ведет себя странно с большими числами. См. Пример ниже, объясненный с выходом. БОЛЬШЕ ИНФОРМАЦИИисточник
Math.floor
сейчас :)Скажем, вы хотите выбрать случайный предмет, который отличается от прошлого раза (не совсем случайный, но все же распространенное требование) ...
Основываясь на ответе @Markus, мы можем добавить еще одну функцию-прототип:
И реализовать так:
источник
Если у вас есть фиксированные значения (например, список названий месяцев) и вы хотите однострочное решение
Вторая часть массива - это операция доступа, как описано в разделе Почему [5,6,8,7] [1,2] = 8 в JavaScript?
источник
Самая короткая версия:
источник
| 0
?| 0
сам по себе является побитовой операцией, которая ничего не делает, но в плавающих элементах javascript перед любой побитовой операцией они преобразуются в целые . Так что это что-то вроде того, как на+ ''
самом деле ничего не делать, но можно использовать для преобразования вещей в строки.Math.floor
но это правильно. Это оператор, поэтому он работает быстрее, чемMath.floor
если бы только потому, что в любой момент выполнения некоторый код может это сделать,Math.floor = someOtherFunction
и они не могут сделать то же самое для '|'. С другой стороны, что касаетсяMath.floor
и|
быть другим, попробуйтеMath.floor(-1.5)
против-1.5 | 0
. Кстати, вам не нужны скобки.|
имеет очень низкий приоритет.Если вы хотите записать его в одну строку, как решение Паскуаля, другое решение было бы написать его, используя функцию поиска ES6 (основываясь на том факте, что вероятность случайного выбора одного из
n
элементов равна1/n
):Используйте этот подход для целей тестирования, и если есть веская причина не сохранять массив только в отдельной переменной. В противном случае другие ответы (
floor(random()*length
и использование отдельной функции) - ваш путь.источник
В Faker.js есть много утилит для генерации случайных тестовых данных. Это хороший вариант в контексте набора тестов:
Как отметили комментаторы, вы вообще не должны использовать эту библиотеку в рабочем коде.
источник
Faker
которого выбирается случайный элемент массива.Редактирование прототипа Array может быть вредным. Здесь это простая функция, чтобы сделать работу.
Применение:
источник
Рекурсивная, автономная функция, которая может возвращать любое количество элементов (идентично lodash.sampleSize ):
источник
Чтобы получить криптостойкий массив случайных элементов, используйте
источник
Это похоже, но более общее, чем решение @Jacob Relkin:
Это ES2015:
Код работает, выбирая случайное число в диапазоне от 0 до длины массива, а затем возвращает элемент с этим индексом.
источник
var item = myArray[Math.floor(Math.random()*myArray.length)];
или эквивалентная более короткая версия:
var item = myArray[(Math.random()*myArray.length)|0];
Образец кода:
источник
Простая функция:
ИЛИ
ИЛИ
источник
На мой взгляд, лучше, чем возиться с прототипами или объявлять их вовремя, я предпочитаю выставлять их в окне:
Теперь в любом месте вашего приложения вы называете это как:
Таким образом, вы все еще можете использовать
for(x in array)
цикл правильноисточник
for...in
на массивах, или даже вообще. Вы рискуете пройти цепочку прототипов. Он также предназначен для всех свойств объекта, а не для всех индексов в массиве. Если вы хотите использовать итератор для массива, используйтеfor (var i = 0; i < foo.length; i++){}
. Еще лучше, используйте что-то вродеArray.prototype.forEach
этого.Я нашел способ обойти сложности верхнего ответа, просто связав переменную rand с другой переменной, которая позволяет отображать это число внутри вызова myArray [] ;. Удалив созданный новый массив и поиграв с его сложностями, я нашел рабочее решение:
источник
concat
здесь что-то меняется ...random
само по себе это не меняет, и больше ничего не вызывается более одного раза ...Вы устанавливаете постоянную переменную для массива, затем у вас есть другая константа, которая выбирает случайным образом между тремя объектами в массиве, а затем функция просто возвращает результаты.
источник
Общий способ получить случайный элемент (ы):
источник
randojs делает это немного более простым и читаемым:
источник
Вот пример того, как это сделать:
источник
другой простой метод:
источник
Создайте одно случайное значение и передайте в массив
Пожалуйста, попробуйте следующий код ..
источник