Как вы создаете массив с Javascript, который может произвольно выбрать любой из кавычек в своем массиве? [dубликат]

Рассмотрим:

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

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

503
задан 5 March 2017 в 01:29

19 ответов

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

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

Сначала поставьте это в свой код где-нибудь:

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

Теперь:

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

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

15
ответ дан 15 August 2018 в 16:38
  • 1
    И это что делает? – Ken Sharp 23 January 2018 в 05:26
  • 2
    @KenSharp позволяет вам называть .sample() для любого массива, чтобы получить случайный элемент – Ben Aubin 23 January 2018 в 06:07

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

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

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

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

7
ответ дан 15 August 2018 в 16:38

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

Основываясь на ответе @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
ответ дан 15 August 2018 в 16:38

Простая функция:

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();
2
ответ дан 15 August 2018 в 16:38
  • 1
    Было бы лучше установить переменную myArrayy внутри вашей функции, чтобы не загрязнять глобальное пространство имен. – Neil Meyer 19 March 2018 в 12:07

Рекурсивная автономная функция, которая может возвращать любое количество элементов (идентичное 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])
}
1
ответ дан 15 August 2018 в 16:38

Я нашел способ преодоления осложнений верхнего ответа, просто связав переменную 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>
1
ответ дан 15 August 2018 в 16:38
  • 1
    Я смущен, почему concat когда-либо меняется здесь ... random сам не меняет его, и ничто другое не вызвано более одного раза .... – BalinKingOfMoria 1 September 2016 в 03:54
  • 2
    Это решение не имеет смысла. Почему вы создаете переменную concat? – superluminary 15 May 2017 в 15:55

На мой взгляд, лучше, чем возиться с прототипами или объявлять его как раз вовремя, я предпочитаю подвергать его окну:

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 правильно

0
ответ дан 15 August 2018 в 16:38
  • 1
    Любая причина объяснять downvotes? – frankies 1 June 2014 в 23:21
  • 2
    Меня здесь не было, когда кто-то его ниспровергал, и я не уменьшал его, но я предполагаю, что разоблачение этого окна в основном объявляет глобальную переменную. См. [D0] stackoverflow.com/questions/2613310/… – Chris 9 April 2015 в 00:30
  • 3
    Вы никогда не должны использовать for...in для массивов или даже в целом. Вы рискуете пройти цепочку прототипов. Он также предназначен для всех свойств объекта, а не для всех индексов в массиве. Если вы хотите использовать итератор в массиве, используйте for (var i = 0; i < foo.length; i++){}. Еще лучше, вместо этого используйте что-то вроде Array.prototype.forEach. – Robert 19 January 2016 в 00:20
  • 4
    Я не предпочитаю этого, потому что он загрязняет глобальную сферу. Вы могли бы сказать, что это может быть единственным, кто будет там, но это даст привычки нарушать эту хорошую практику. – Jekk 15 November 2016 в 09:43

Создайте одно случайное значение и перейдите к массиву

Пожалуйста, попробуйте следующий код ..

//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);
-2
ответ дан 15 August 2018 в 16:38
  • 1
    Этот ответ использует то же решение, что и уже принятый ответ. Вы должны воздержаться от повторного добавления одного и того же решения и вместо этого использовать только другие альтернативы, которые могли бы внести большой вклад в разговор. – ManBearPixel 21 December 2017 в 21:44
[F1]
0
ответ дан 15 August 2018 в 16:38

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

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

75
ответ дан 15 August 2018 в 16:38
  • 1
    Я тоже делал то же самое, хотя иногда вы должны быть осторожны, когда сталкиваетесь с Array.prototype, особенно при использовании сторонних модулей. – jdotjdot 21 August 2012 в 07:53
  • 2
    Сложная практика заключается в том, чтобы добавлять / удалять методы для объектов, которые у вас нет. Возьмем, к примеру, prototype.js. – Rihards 9 October 2012 в 12:30
  • 3
    @Richards нет, это не так, если вы не создаете библиотеку. Это мнение. – Benjamin Gruenbaum 13 November 2013 в 17:43
  • 4
    Если вы сделаете это, у вас будет дополнительное свойство на всех ваших массивах, испортив ваши петли for (i in array) ... – frankies 13 May 2014 в 15:21
  • 5
    Вы можете сделать свойство неперечислимым . Тем не менее, я все еще думаю, что это плохая практика для прототипов обезьян-патчей. Функция-bind (: :) является альтернативой: github.com/zenparsing/es-function-bind . Решение MarkusAmaltheaMagnuson (в частности, исключая свойство при повторении) слишком много, чтобы помнить, на мой взгляд, и может вводить тонкие ошибки. – Max Heiber 2 January 2016 в 19:14

Это похоже на, но более общее, чем решение @Jacob Relkin:

Это ES2015:

const randomChoice = arr => {
    const randIndex = Math.floor(Math.random() * arr.length);
    return arr[randIndex];
};

Код работает, выбирая случайное число между 0 и длина массива, а затем возвращает элемент в этом индексе.

2
ответ дан 15 August 2018 в 16:38

Вот пример того, как это сделать:

$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)];
-1
ответ дан 15 August 2018 в 16:38

Эта работа как прелесть для меня без повторения.

   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;
    }
}
0
ответ дан 15 August 2018 в 16:38

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

const Faker = require('faker');
Faker.random.arrayElement(['January', 'February', 'March']);
0
ответ дан 15 August 2018 в 16:38
  • 1
    Для простой проблемы, подобной этой, добавление зависимости для всей библиотеки не нужно и добавляет к раздуванию кода. Во всяком случае, вы могли бы порекомендовать фактический метод из Faker, который выбирает случайный элемент массива. – ManBearPixel 21 December 2017 в 21:41
  • 2
    «Простая проблема» как этот, обычно решаются библиотеками, которые обеспечивают простое решение проблемы, с которой столкнулись сотни человек. Эти библиотеки, как правило, надежны и хорошо отлажены и имеют различные предостережения, которые мы не хотим повторять. Обычно я бы рекомендовал использовать библиотеку. – smonff 16 May 2018 в 10:59

static generateMonth() { 
const theDate = ['January', 'February', 'March']; 
const randomNumber = Math.floor(Math.random()*3);
return theDate[randomNumber];
};

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

1
ответ дан 15 August 2018 в 16:38

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

var myArray = ['January', 'February', 'March']; 
var rand = myArray[(Math.random() * myArray.length) | 0]
8
ответ дан 15 August 2018 в 16:38

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);

2
ответ дан 15 August 2018 в 16:38

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

3
ответ дан 15 August 2018 в 16:38

Другие вопросы по тегам:

Похожие вопросы: